LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBOYW1lOiAgICBza2dlYXNmLmMKICogUHJvamVjdDogR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKICogVmVyc2lvbjogJFJldmlzaW9uOiAxLjEuMi42ICQKICogRGF0ZTogICAgJERhdGU6IDIwMDcvMDYvMjggMDk6NDA6NTQgJAogKiBQdXJwb3NlOiBBU0YgSGFuZGxlci4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIChDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgogKiAgKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBEZXNjcmlwdGlvbjoKICoKICogVGhpcyBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gaGFuZGxlIGFsbCB0aGUgYXNmIGZ1bmN0aW9ucwogKgogKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgogKgogKiAgICJoL3NrZHJ2MXN0LmgiCiAqICAgImgvc2tkcnYybmQuaCIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiBFdmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcgoqLwojaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQpzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQoiJEhlYWRlcjogL2RhdGEvY3ZzL3N3ZXByb2plY3RzL3l1a29uMi9saW5kcnYvYXNmX2xpbnV4L0F0dGljL3NrZ2Vhc2YuYyx2IDEuMS4yLjYgMjAwNy8wNi8yOCAwOTo0MDo1NCBtYXJjdXNyIEV4cCAkIiA7CiNlbmRpZgoKI2RlZmluZSBfX1NLQVNGX0MKCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiIHsKI2VuZGlmICAvKiBjcGx1c3BsdXMgKi8KCgovLyAjaW5jbHVkZSA8bnRkZGsuaD4KLy8gI2luY2x1ZGUgPHdkbS5oPgoKCiNpbmNsdWRlICJoL3NrdHlwZXMuaCIKI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKI2luY2x1ZGUgImgvc2tnZWFzZi5oIgojaW5jbHVkZSAiaC9za2dlc3BpLmgiCiNpbmNsdWRlICJoL3NrZm9wcy5oIgojaW5jbHVkZSA8YWNwaS9hY3BpLmg+CgovLyNpbmNsdWRlICJoL3l1ay5oIgovLyNpbmNsdWRlICJoL3NrdnBkLmgiCgovLyNpbmNsdWRlIDxzdGRsaWIuaD4KCnN0YXRpYyBjaGFyICpBc2ZGaWxlTmFtZSAgPSAiL2V0Yy9zazk4bGluL0FjcGlBc2YuYmluIjsKI2lmbmRlZiBVU0VfQVNGX0RBU0hfRlcKc3RhdGljIGNoYXIgKklwbWlGaWxlTmFtZVMxICA9ICIvZXRjL3NrOThsaW4vaXBtaXlrMi1zMS5iaW4iOwpzdGF0aWMgY2hhciAqSXBtaUZpbGVOYW1lUzIgID0gIi9ldGMvc2s5OGxpbi9pcG1peWsyLXMyLmJpbiI7CiNlbmRpZgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCnN0YXRpYyBjaGFyICpEYXNoRmlsZU5hbWVTMSAgPSAiL2V0Yy9zazk4bGluL2Rhc2h5ZXgtczEuYmluIjsKc3RhdGljIGNoYXIgKkRhc2hGaWxlTmFtZVMyICA9ICIvZXRjL3NrOThsaW4vZGFzaHlleC1zMi5iaW4iOwojZW5kaWYKLy8gc3RhdGljIGNoYXIgKlNpbXVBc2ZUYWIgCT0gIi9ldGMvc2s5OGxpbi9BY3BpQXNmLmJpbiI7CgovLyBBUlAgcGF0dGVybiA0MCBieXRlICg1IGJ5dGVzIGluIG1hc2spCi8vIHRoaXMgcGF0dGVybiBsZW5ndGggY29ycmVzcG9uZHMgd2l0aCBZTENJX01BQ1JYRklGT1RIUkVTCi8vIFBhdHRlcm4gbWFzayBmb3IgQVJQIEZyYW1lcwojaWZkZWYgQVNGX09OTFlfQVJQX1JFUVVFU1QKc3RhdGljIFNLX1U4IEFSUF9GUkFNRV9QQVRURVJOW10gPQp7CiAgICAvKiBNQUMgSGVhZGVyIC0gMTQgYnl0ZXMgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLypEZXN0IE1BQyBBZGRyICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qU3JjIE1BQyBBZGRyICAqLwogICAgMHgwOCwgMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZyYW1lIFR5cGUgICAgKi8KICAgIC8qIEFSUCBIZWFkZXIgLSAyOCBieXRlcyAqLwogICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXJkIHR5cGUgICAgKi8KICAgIDB4MDgsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvdCB0eXBlICAgICovCiAgICAweDA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhcmQgc2l6ZSAgICAqLwogICAgMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90IHNpemUgICAgKi8KICAgIDB4MDAsIDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3AgPSByZXF1ZXN0ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qIHNlbmRlcnMgbWFjICAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKiBzZW5kZXJzIGlwICAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogdGFyZ2V0IG1hYyAgICovCiAgICAweDAwLCAweDAwfTsKc3RhdGljIFNLX1U4IEFSUF9QQVRURVJOX01BU0tbXSA9IHsgMHgwMCwgMHhGMCwgMHgzRiwgMHgwMCwgMHgwMCB9OwojZWxzZQpzdGF0aWMgU0tfVTggQVJQX0ZSQU1FX1BBVFRFUk5bXSA9CnsKICAgIC8qIE1BQyBIZWFkZXIgLSAxNCBieXRlcyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKkRlc3QgTUFDIEFkZHIgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLypTcmMgTUFDIEFkZHIgICovCiAgICAweDA4LCAweDA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRnJhbWUgVHlwZSAgICAqLwogICAgLyogQVJQIEhlYWRlciAtIDI4IGJ5dGVzICovCiAgICAweDAwLCAweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhcmQgdHlwZSAgICAqLwogICAgMHgwOCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm90IHR5cGUgICAgKi8KICAgIDB4MDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFyZCBzaXplICAgICovCiAgICAweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3Qgc2l6ZSAgICAqLwogICAgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcCA9IHJlcXVlc3QgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogc2VuZGVycyBtYWMgICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgIC8qIHNlbmRlcnMgaXAgICAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKiB0YXJnZXQgbWFjICAgKi8KICAgIDB4MDAsIDB4MDB9OwpzdGF0aWMgU0tfVTggQVJQX1BBVFRFUk5fTUFTS1tdID0geyAweDAwLCAweEYwLCAweDAwLCAweDAwLCAweDAwIH07CiNlbmRpZgoKLy8gUlNQIHBhdHRlcm4gLSA0MCBieXRlcyAodGhpcyBtYWtlcyA1IGJ5dGVzIGluIFJTUF9QQVRURVJOX01BU0spCi8vIHRoaXMgcGF0dGVybiBsZW5ndGggY29ycmVzcG9uZHMgd2l0aCBZTENJX01BQ1JYRklGT1RIUkVTCnN0YXRpYyBTS19VOCBSU1BfRlJBTUVfUEFUVEVSTltdID0KeyAgIC8qIE1BQyBIZWFkZXIgKDE0IGJ5dGVzKSAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgIC8qRGVzdCBNQUMgQWRkciovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgLypTcmMgTUFDIEFkZHIgKi8KICAgIDB4MDgsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZyYW1lIFR5cGUgICAqLwogICAgLyogSVAgSGVhZGVyICgyMCBieXRlcykgKi8KICAgIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICYgSGVhZGVyIExlbmd0aCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgIC8qU3JjIElQIGFkZHJlc3MqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgIC8qTXkgSVAgYWRkcmVzcyovCiAgICAvKiBwYXJ0IG9mIFVEUCBIZWFkZXIgKDYgYnl0ZXMpICovCiAgICAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3JjIHBvcnQgICAqLwogICAgMHgwMiwgMHg5OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlc3QuIHBvcnQgKi8KICAgIDB4MDAsIDB4MDB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggICAgICovCgovLyBQYXR0ZXJuIG1hc2sgZm9yIFJTUCBGcmFtZXMKc3RhdGljIFNLX1U4IFJTUF9QQVRURVJOX01BU0tbXSA9IHsgMHgwMCwgMHg3MCwgMHg4MCwgMHgwMCwgMHgzMCB9OwoKLy8gUk1DUCBwYXR0ZXJuICh1bnNlY3VyZSBwb3J0KQovLyB0aGlzIHBhdHRlcm4gbGVuZ3RoIGNvcnJlc3BvbmRzIHdpdGggWUxDSV9NQUNSWEZJRk9USFJFUwpzdGF0aWMgU0tfVTggUk1DUF9GUkFNRV9QQVRURVJOW10gPQp7ICAgLyogTUFDIEhlYWRlciAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKkRlc3QgTUFDIEFkZHIqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKlNyYyBNQUMgQWRkciAqLwogICAgMHgwOCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZyYW1lIFR5cGUgICAqLwogICAgLyogSVAgSGVhZGVyICovCiAgICAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gJiBIZWFkZXIgTGVuZ3RoICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKlNyYyBJUCBhZGRyZXNzKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLypNeSBJUCBhZGRyZXNzKi8KICAgIC8qIFVEUCBIZWFkZXIgKi8KICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcmMgcG9ydCAqLwogICAgMHgwMiwgMHg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuc2VjdXJlIGRlc3QuIHBvcnQgKi8KICAgIDB4MDAsIDB4MDB9OwoKLy8gUGF0dGVybiBtYXNrIGZvciBSTUNQIEZyYW1lcwpzdGF0aWMgU0tfVTggUk1DUF9QQVRURVJOX01BU0tbXSA9IHsgMHgwMCwgMHg3MCwgMHg4MCwgMHgwMCwgMHgzMCB9OwoKI2lmIDAKLy8gVENQIHBhdHRlcm4Kc3RhdGljIFNLX1U4IFRDUF9GUkFNRV9QQVRURVJOW10gPQp7ICAgLyogTUFDIEhlYWRlciAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKkRlc3QgTUFDIEFkZHIqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAvKlNyYyBNQUMgQWRkciAqLwogICAgMHgwOCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZyYW1lIFR5cGUgICAqLwogICAgLyogSVAgSGVhZGVyICovCiAgICAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgIC8qIFZlcnNpb24gJiBIZWFkZXIgTGVuZ3RoICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKiBQcm90b2NvbCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKlNyYyBJUCBhZGRyZXNzKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLypNeSBJUCBhZGRyZXNzKi8KICAgIC8qIFVEUCBIZWFkZXIgKi8KICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcmMgcG9ydCAqLwogICAgMHgwMiwgMHg2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVuc2VjdXJlIGRlc3QuIHBvcnQgKi8KICAgIDB4MDAsIDB4MDB9OwoKLy8gUGF0dGVybiBtYXNrIGZvciBUQ1AgRnJhbWVzCnN0YXRpYyBTS19VOCBUQ1BfUEFUVEVSTl9NQVNLW10gPSAKeyAweDAwLCAweDcwLCAweDgwLCAweDAwLCAweDMwIH07CiNlbmRpZgoKLy8gSUNNUCBwYXR0ZXJuCnN0YXRpYyBTS19VOCBJQ01QX0ZSQU1FX1BBVFRFUk5bXSA9CnsgICAvKiBNQUMgSGVhZGVyICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qRGVzdCBNQUMgQWRkciovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qU3JjIE1BQyBBZGRyICovCiAgICAweDA4LCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRnJhbWUgVHlwZSAgICovCiAgICAvKiBJUCBIZWFkZXIgKi8KICAgIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAmIEhlYWRlciBMZW5ndGggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgIC8qIFByb3RvY29sICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgIC8qU3JjIElQIGFkZHJlc3MqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKk15IElQIGFkZHJlc3MqLwogICAgLyogSUNNUCBIZWFkZXIgKi8KICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgIAogICAgMHgwMCwgMHgwMH07CgovLyBQYXR0ZXJuIG1hc2sgZm9yIElDTVAgRnJhbWVzCnN0YXRpYyBTS19VOCBJQ01QX1BBVFRFUk5fTUFTS1tdID0gCnsgMHgwMCwgMHg3MCwgMHg4MCwgMHgwMCwgMHgwMCB9OwoKLy8gU05NUCBwYXR0ZXJuCnN0YXRpYyBTS19VOCBTTk1QX0ZSQU1FX1BBVFRFUk5bXSA9CnsgICAvKiBNQUMgSGVhZGVyICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgIC8qIERlc3QgTUFDIEFkZHIgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogU3JjIE1BQyBBZGRyICovCiAgICAweDA4LCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIFR5cGUgKi8KICAgIC8qIElQIEhlYWRlciAqLwogICAgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAvKiBWZXJzaW9uICYgSGVhZGVyIExlbmd0aCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLyogUHJvdG9jb2wgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLyogU3JjIElQIGFkZHJlc3MgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgLyogTXkgSVAgYWRkcmVzcyAqLwogICAgLyogVURQIEhlYWRlciAqLwogICAgMHgwMCwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcmMgcG9ydCAqLwogICAgMHgwMCwgMHhhMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnNlY3VyZSBkZXN0LiBwb3J0ICovCiAgICAweDAwLCAweDAwfTsKCi8vIFBhdHRlcm4gbWFzayBmb3IgU05NUCBGcmFtZXMKc3RhdGljIFNLX1U4IFNOTVBfUEFUVEVSTl9NQVNLW10gPSAKeyAweDAwLCAweDcwLCAweDgwLCAweDAwLCAweDMwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNrQXNmUmVzdG9yZVBhdHRlcm4gLSBpbnRlcmZhY2UgZnVuY3Rpb24gKGdsb2JhbCBzeW1ib2wpCioKKiBEZXNjcmlwdGlvbjoKKiByZXN0b3JlcyBwYXR0ZXJuIGZvciBBU0YgYW5kIElQTUkKKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwoKaW50IFNrQXNmUmVzdG9yZVBhdHRlcm4gKAogICAgU0tfQUMgKnBBQyAsICAgIC8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCiAgICBTS19JT0MgSW9DKSAgICAgLyogSU8gY29udGV4dCBoYW5kbGUgKi8KewogICAgaWYgKHBBQy0+QXNmRGF0YS5PcE1vZGUgPT0gU0tfR0VBU0ZfTU9ERV9BU0YpIHsKCiAgICAgICAgLy8gYXNmIG1vZGUgLT4gIHdlIGFyZSBydW5uaW5nIG9uCiAgICAgICAgLy8geXVrb24gZWMgd2l0aCBvbmx5IG9uZSBwb3J0CiAgICAgICAgQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAwKTsKCiAgICB9IGVsc2UgewogICAgICAgIGlmIChwQUMtPkFzZkRhdGEuT3BNb2RlID09IFNLX0dFQVNGX01PREVfSVBNSSkgewogICAgICAgICAgICAvLyBpcG1pIG1vZGUgLT4gIHdlIGFyZSBydW5uaW5nIG9uCiAgICAgICAgICAgIC8vIHl1a29uIDIgd2l0aCBhdCBsZWFzdCBvbmUgcG9ydAogICAgICAgICAgICBBc2ZTZXRVcFBhdHRlcm4ocEFDLCBJb0MsIDApOyAgICAgICAvLyBwb3J0IEEKCiAgICAgICAgICAgIGlmIChwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPT0gU0tfR0VBU0ZfWTJfRFVBTFBPUlQpIHsKICAgICAgICAgICAgICAgIEFzZlNldFVwUGF0dGVybihwQUMsIElvQywgMSk7ICAgLy8gcG9ydCBCCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIChTS19BU0ZfUE5NSV9FUlJfT0spOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNrQXNmSW5pdCAtIEluaXQgZnVuY3Rpb24gb2YgQVNGCioKKiBEZXNjcmlwdGlvbjoKKiAgIFNLX0lOSVRfREFUQTogSW5pdGlhbGlzZXMgdGhlIGRhdGEgc3RydWN0dXJlcwoqICAgU0tfSU5JVF9JTzogUmVzZXRzIHRoZSBYTUFDIHN0YXRpc3RpY3MsIGRldGVybWluZXMgdGhlIGRldmljZSBhbmQKKiAgICBjb25uZWN0b3IgdHlwZS4KKiAgIFNLX0lOSVRfUlVOOiBTdGFydHMgYSB0aW1lciBldmVudCBmb3IgcG9ydCBzd2l0Y2ggcGVyIGhvdXIKKiAgICBjYWxjdWxhdGlvbi4KKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwppbnQgU2tBc2ZJbml0KAogICAgICAgICAgICAgU0tfQUMgKnBBQywgICAgLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KICAgICAgICAgICAgIFNLX0lPQyBJb0MsICAgIC8qIElPIGNvbnRleHQgaGFuZGxlICovCiAgICAgICAgICAgICBpbnQgTGV2ZWwpICAgICAvKiBJbml0aWFsaXphdGlvbiBsZXZlbCAqLwp7CglTS19VMzIgICAgICAgICAgVG1wVmFsMzI7CglTS19VMzIgICAgICAgICAgRmxhc2hPZmZzZXQgPSAwOwoJU0tfVTMyICAgICAgICAgIGk7CgoJU0tfVTMyICAgICAgICAgIEZpbGVMZW5ndGhTMTsKCVNLX1UzMiAgICAgICAgICBGaWxlTGVuZ3RoUzI7CgljaGFyICAgICAgICAgICAgKkZ3RmlsZU5hbWVTMSA9IE5VTEw7CgljaGFyICAgICAgICAgICAgKkZ3RmlsZU5hbWVTMiA9IE5VTEw7CglTS19VOCAgICAgICAgICAgKnBBc2ZGd1MxID0gTlVMTDsKCVNLX1U4ICAgICAgICAgICAqcEFzZkZ3UzIgPSBOVUxMOwoKCVNLX1U4ICAgICAgICAgICBGbGFzaE9rOwoJaW50ICAgICAgICAgICAgIFJldENvZGU7CglTS19CT09MICAgICAgICAgRG9VcGRhdGUgPSBTS19GQUxTRTsKCVNLX1U4ICAgICAgICAgICBsUmV0Q29kZTsKCVNLX1UzMiAgICAgICAgICBGd0ltYWdlQ3NPazsKCVNLX1UzMiAgICAgICAgICBGd0ZsYXNoQ3NPazsKCVNLX1UzMiAgICAgICAgICBGd0ltYWdlQ3MgPSAwOwoJU0tfVTMyICAgICAgICAgIEZ3Rmxhc2hDcyA9IDA7CglTS19VMzIgICAgICAgICAgRndDczsKCVNLX1UzMiAgICAgICAgICAqcFRtcDMyOwoJU0tfVTggICAgICAgICAgICpwSGNpUmVjQnVmOwoJU0tfRVZQQVJBICAgICAgIEV2ZW50UGFyYW07IC8qIEV2ZW50IHN0cnVjdCBmb3IgdGltZXIgZXZlbnQgKi8KCXVuc2lnbmVkIGxvbmcgICBGbGFzaFNpemU7Cgl1bnNpZ25lZCBsb25nICAgRXJhc2VPZmYgPSAwOwoJU0tfVTMyICAgICAgICAgIFNwaVJldFZhbDsKCVNLX1U4ICAgICAgICAgICBUbXAxVmFsOCwgVG1wMlZhbDg7CglTS19CT09MICAgICAgICAgWXVrb25FY0ExOwoJU0tfVTggICAgICAgICAgIE9sZEd1aWRbMTZdOwoJU0tfVTggICAgICAgICAgIEFzZkZsYWcgPSAwLCBJcG1pRmxhZyA9IDAsIEFzZkRhc2hGbGFnID0gMDsKCVNLX1U4ICAgICAgICAgICBBc2ZIaW50Qml0ID0gMCwgSXBtaUhpbnRCaXQgPSAwLCBOb0hpbnRCaXQgPSAwOwoKCVJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfT0s7CgoJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAoJCSgiQVNGOiBTa0FzZkluaXQ6IENhbGxlZCwgbGV2ZWw9JWQgIHNpem9mIEFTRi1NSUI6MHgleCBCeXRlc1xuIiwgTGV2ZWwsIHNpemVvZihTVFJfQVNGX01JQikgKSApOwoKCS8qIFl1a29uRWNBMSBpbnRyb2R1Y2VkIGJ5IHJzY2htaWR0ICovCglZdWtvbkVjQTEgPSAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fRUMgJiYgcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSBDSElQX1JFVl9ZVV9FQ19BMSk7CgoJc3dpdGNoKExldmVsKQoJewoJY2FzZSBTS19JTklUX0RBVEE6CgkJLyogU2V0IHN0cnVjdHVyZSB0byB6ZXJvICovCgkJLy8gIFRoaXMgd2lsbCBiZSBkb25lIGluIGZ1bmN0aW9uICJBc2ZSZWFkQ29uZmlndXJhdGlvbiIKCQkvLyAgU0tfTUVNU0VUKChjaGFyICopJnBBQy0+QXNmRGF0YSwgMCwgc2l6ZW9mKHBBQy0+QXNmRGF0YSkpOwoKCQlwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCA9IDA7CgkJcEFDLT5Bc2ZEYXRhLk9wTW9kZSAgICAgPSBTS19HRUFTRl9NT0RFX0lQTUk7CgkJcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlICAgPSBTS19HRUFTRl9DSElQX1VOS05PV047CgoJCXBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgID0gQVNGX0lOSVRfVU5ERUZJTkVEOwoJCWJyZWFrOwoKCWNhc2UgU0tfSU5JVF9JTzoKI2lmICgwKQoJCS8qICBTZXQgT1MgUHJlc2VudCBGbGFnIGluIEFTRiBTdGF0dXMgYW5kIENvbW1hbmQgUmVnaXN0ZXIgKi8KCQlTS19JTjMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgJlRtcFZhbDMyICk7CgkJVG1wVmFsMzIgfD0gQklUXzQ7CgkJU0tfT1VUMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCBUbXBWYWwzMiApOwojZW5kaWYKCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQlBc2ZSZXNldE9zUHJlc2VudEJpdCggcEFDLCBJb0MgKTsKCgkJWWxjaUVuYWJsZVBhdHRlcm4oIHBBQywgSW9DLCAwLCBBU0ZfREFTSF9QQVRURVJOX05VTV9BUlAgKTsKCQlZbGNpRW5hYmxlUGF0dGVybiggcEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX0lDTVAgKTsKCQlZbGNpRW5hYmxlUGF0dGVybihwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fU05NUCk7CiNlbmRpZgoKI2lmZGVmIEFTRl9DSEVDS19ISURERU5fSUQgIC8vIGhlcmUgd2Ugd2lsbCBjaGVjayBoaWRkZW4gaWQgX2FuZF8gY2hpcCBpZAoKCQkvKiBjaGVjayBjaGlwIGlkICovCgkJU0tfSU44KCBJb0MsIEIyX0NISVBfSUQsICZUbXAxVmFsOCApOwoJCXN3aXRjaChUbXAxVmFsOCkKCQl7CgojaWZkZWYgQ0hJUF9JRF9ZVUtPTl9FWAkJCQkJCgkJY2FzZSBDSElQX0lEX1lVS09OX0VYOgoJCSAgcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlID0gU0tfR0VBU0ZfQ0hJUF9FWDsKCQkgIAoJCSAgLy9wQUMtPkFzZkRhdGEuRmxhc2hPZmZzIAk9IEFTRl9GTEFTSF9FWF9PRkZTOwoJCSAgLy9wQUMtPkFzZkRhdGEuRmxhc2hPZmZzVmVyIAk9IEFTRl9GTEFTSF9FWF9PRkZTX1ZFUjsKCQkgIC8vcEFDLT5Bc2ZEYXRhLkZsYXNoT2Zmc1JldiAJPSBBU0ZfRkxBU0hfRVhfT0ZGU19SRVY7CgkJICAvL3BBQy0+QXNmRGF0YS5GbGFzaE9mZnNDcyAJPSBBU0ZfRkxBU0hfRVhfT0ZGU19DUzsKCQkgIC8vcEFDLT5Bc2ZEYXRhLkZsYXNoT2Zmc0d1aWQJPSBBU0ZfRkxBU0hfRVhfT0ZGU19HVUlEOwoJCSAgLy9wQUMtPkFzZkRhdGEuRmxhc2hPZmZzQWNwaQk9IEFTRl9GTEFTSF9FWF9PRkZTX0FDUEk7CgkJICBicmVhazsKI2VuZGlmICAvLyAgQ0hJUF9JRF9ZVUtPTl9FWAoJCWNhc2UgQ0hJUF9JRF9ZVUtPTl9FQzoKCQkJLyogWVVLT05fRUMgKi8KCQkJLyogY2hpcC1pZCBpcyBvaywgY2hlY2sgaGlkZGVuIGlkICovCgkJCVNLX0lOOCggSW9DLCBCMl9NQUNfQ0ZHLCAmVG1wMlZhbDggKTsKCQkJVG1wMlZhbDggJj0gMHgwMzsKCQkJaWYoIChUbXAyVmFsOCAhPSAxKSAmJiAgICAgICAvLyAgODhFODA1MgoJCQkJKFRtcDJWYWw4ICE9IDMpICkgeyAgICAgIC8vICA4OEU4MDUwCgkJCQlSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX0dFTkVSQUw7CgkJCX0gZWxzZSB7CgkJCQlwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPSBTS19HRUFTRl9DSElQX0VDOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgQ0hJUF9JRF9ZVUtPTl9YTDoKCQkJLyogWVVLT05fMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGlwLWlkIGlzIG9rLCBjaGVjayBoaWRkZW4gaWQgKi8KCQkJU0tfSU44KCBJb0MsIEIyX01BQ19DRkcsICZUbXAyVmFsOCApOwoJCQlUbXAyVmFsOCAmPSAweDAzOwoJCQlpZihUbXAyVmFsOCAhPSAwKSB7CgkJCQlSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX0dFTkVSQUw7CgkJCX0gZWxzZSB7CgkJCQlwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPSBTS19HRUFTRl9DSElQX1kyOwoJCQl9CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCS8qIE5vdGhpbmcgdG8gZG8uIENoaXAgaWQgZG9lcyBub3QgbWF0Y2ggKi8KCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQlicmVhazsKCQl9CgoJCWlmIChSZXRDb2RlICE9IFNLX0FTRl9QTk1JX0VSUl9PSykgewoKCQkJcEFDLT5Bc2ZEYXRhLkluaXRTdGF0ZSA9IEFTRl9JTklUX0VSUk9SX0NISVBfSUQ7CgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJTa0FzZkluaXQ6ICoqKiBBU0YvSVBNSSBOT1QgU1VQUE9SVEVEICoqKlxuIikpOwoKCQkJLyogaGlkZGVuIElEIGRvZXNuJ3QgbWF0Y2ggKHdoaWNoIGNhcmQgZG8gd2UgYWNjZXNzPykKCQkJLy8gZG8gbm90IHNldCBhbnkgcmVnaXN0ZXJzCgoJCQlBc2ZEaXNhYmxlKHBBQywgSW9DKTsKCgkJCUFzZlJlc2V0Q3B1KHBBQywgSW9DKTsgICAgICAgLy8gcmVzZXQgY3B1CgoJCQkvLyBkaXNhYmxlIGFsbCBwYXR0ZXJuIGZvciBhc2YvaXBtaQoJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIDQpOwoJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIDUpOwoJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIDYpOwoKCQkJaWYgKCAoQ0hJUF9JRF9ZVUtPTl8yKHBBQykpICYmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgKSB7CgkJCQkvLyBkbyBub3QgZm9yZ2V0IHRoZSBzZWNvbmQgbGluawoJCQkJLy8gZGlzYWJsZSBhbGwgcGF0dGVybiBmb3IgYXNmL2lwbWkKCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMSwgNCk7CgkJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDUpOwoJCQkJWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAxLCA2KTsKCQkJfQoJCQkqLwoJCQlicmVhazsKCQl9CgojZW5kaWYKCQkvKiBDSEVDSyB0aGUgQVNGIGhpbnQgYml0cy4uLgoJCSAqIGFsbCBZdWtvbklJOgoJCSAqIEFwcGxpY2F0aW9uIEluZm9ybWF0aW9uIFJlZ2lzdGVyIGF1ZiAweDAxMWUsIEJpdCA3OjYKCQkgKiAKCQkgKiBLb2RpZXJ1bmc6CgkJICogICAgICAwYjAwICAgIGtlaW4gImhpbnQiOyBqZXR6aWdlciBadXN0YW5kCgkJICogICAgICAwYjAxICAgIGN1c3RvbWVyIHdhbnRzIEFTRiB0byBiZSBsb2FkZWQKCQkgKiAgICAgIDBiMTAgICAgY3VzdG9tZXIgd2FudHMgSVBNSSB0byBiZSBsb2FkZWQKCQkgKiAgICAgIDBiMTEgICAgY3VzdG9tZXIgZG9lcyBub3Qgd2FudCBBU0Ygb3IgSVBNSSB0byBnbyBpbiBoZXJlCgkJICogCgkJICogIEFsbGUgYmlzaGVyaWdlbiBFRVBST00gVmVyc2lvbmVuIGJyaW5nZW4gMGIwMC4KCQkgKi8KCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogQ0hFQ0sgQVNGIGhpbnQgYml0cyAqKipcbiIpKTsKCQlTS19JTjMyKElvQywgQjJfWTJfSFdfUkVTLCAmVG1wVmFsMzIpOwoJCXN3aXRjaChUbXBWYWwzMiAmIDB4YzApIHsKCQljYXNlIDB4YzA6CgkJCUFzZkhpbnRCaXQgID0gMDsKCQkJSXBtaUhpbnRCaXQgPSAwOwoJCQlOb0hpbnRCaXQgICA9IDE7CgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJTa0FzZkluaXQ6ICoqKiBBU0YgaGludCBiaXRzOiBOTyBBU0YvSVBNSSAqKipcbiIpKTsKCQkJYnJlYWs7CgkJY2FzZSAweDQwOgoJCQlBc2ZIaW50Qml0ICA9IDE7CgkJCUlwbWlIaW50Qml0ID0gMDsKCQkJTm9IaW50Qml0ICAgPSAwOwoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogQVNGIGhpbnQgYml0czogQVNGICoqKlxuIikpOwoJCQlicmVhazsKCQljYXNlIDB4ODA6CgkJCUFzZkhpbnRCaXQgID0gMDsKCQkJSXBtaUhpbnRCaXQgPSAxOwoJCQlOb0hpbnRCaXQgICA9IDA7CgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJTa0FzZkluaXQ6ICoqKiBBU0YgaGludCBiaXRzOiBJUE1JICoqKlxuIikpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlBc2ZIaW50Qml0ICA9IDA7CgkJCUlwbWlIaW50Qml0ID0gMDsKCQkJTm9IaW50Qml0ICAgPSAxOwoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogQVNGIGhpbnQgYml0czogRGVmYXVsdCBBU0YvSVBNSSAqKipcbiIpKTsKCQkJYnJlYWs7CgkJfQoKCQkvKiBoZXJlIHdlIGRvIG5vdCBrbm93IHdoaWNoIGZpcm13YXJlIHdlIG11c3QgbG9hZCAoaXBtaSBvciBhc2YpLi4uICovCgkJcEFDLT5Bc2ZEYXRhLk9wTW9kZSA9IFNLX0dFQVNGX01PREVfVU5LTk9XTjsKCQlBc2ZGbGFnICA9IDA7CgkJSXBtaUZsYWcgPSAwOwoJCUFzZkRhc2hGbGFnID0gMDsJCQoKCQkvKiB0cnkgdG8gb3BlbiB0aGUgQVNGIGJpbmFyeSAqLwoJCWlmICggZndfZmlsZV9leGlzdHMocEFDLCBBc2ZGaWxlTmFtZSkgKSB7CgkJCS8qIGhlcmUgd2UgaGF2ZSBmb3VuZCB0aGUgYXNmIGJpbmFyeSAqLwoJCQkKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmSW5pdDogKioqIEFTRiBiaW5hcnkgZmlsZSBmb3VuZC4uLlxuIikpOwoJCQlBc2ZGbGFnID0gMTsKCQkJRndGaWxlTmFtZVMxID0gQXNmRmlsZU5hbWU7CgkJCUZ3RmlsZU5hbWVTMiA9IE5VTEw7CgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCIqKiogQXNmRmxhZyA9IDEgKioqXG4iKSk7CgkJfSBlbHNlIHsKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmSW5pdDogKioqIEFTRiBiaW5hcnkgZmlsZSBfTk9UXyBmb3VuZCFcbiIpKTsKCQl9CgoKI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCS8qIHRyeSB0byBvcGVuIEFTRiBEQVNIIGJpbmFyeSAqLwoJCWlmICggZndfZmlsZV9leGlzdHMocEFDLCBEYXNoRmlsZU5hbWVTMSkgICYmIAoJCQlmd19maWxlX2V4aXN0cyhwQUMsIERhc2hGaWxlTmFtZVMyKSApIHsKCQkJLyogaGVyZSB3ZSBoYXZlIGZvdW5kIHRoZSBBU0YgREFTSCBiaW5hcnkgKi8KCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmSW5pdDogKioqIEFTRiBEQVNIIGJpbmFyeSBmaWxlIGZvdW5kLi4uXG4iKSk7CgkJCUFzZkRhc2hGbGFnID0gMTsKCQkJRndGaWxlTmFtZVMxID0gRGFzaEZpbGVOYW1lUzE7CgkJCUZ3RmlsZU5hbWVTMiA9IERhc2hGaWxlTmFtZVMyOwoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiKioqIElwbWlGbGFnID0gMSAqKipcbiIpKTsKCQl9IGVsc2UgewoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogQVNGIERBU0ggYmluYXJ5IGZpbGUgX05PVF8gZm91bmQhXG4iKSk7CgkJfQojZWxzZQoJCS8qIHRyeSB0byBvcGVuIElQTUkgYmluYXJ5ICovCgkJaWYgKCBmd19maWxlX2V4aXN0cyhwQUMsIElwbWlGaWxlTmFtZVMxKSAgJiYgCgkJCWZ3X2ZpbGVfZXhpc3RzKHBBQywgSXBtaUZpbGVOYW1lUzIpICkgewoJCQkvKiBoZXJlIHdlIGhhdmUgZm91bmQgdGhlIGlwbWkgYmluYXJ5ICovCgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJTa0FzZkluaXQ6ICoqKiBJUE1JIGJpbmFyeSBmaWxlIGZvdW5kLi4uXG4iKSk7CgkJCUlwbWlGbGFnID0gMTsKCQkJRndGaWxlTmFtZVMxID0gSXBtaUZpbGVOYW1lUzE7CgkJCUZ3RmlsZU5hbWVTMiA9IElwbWlGaWxlTmFtZVMyOwoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiKioqIElwbWlGbGFnID0gMSAqKipcbiIpKTsKCQl9IGVsc2UgewoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogSVBNSSBiaW5hcnkgZmlsZSBfTk9UXyBmb3VuZCFcbiIpKTsKCQl9CiNlbmRpZgoKCQkvKiBzZXQgdGhlIG9wZXJhdGlvbiBtb2RlICovCgkJaWYgKCAoQXNmRmxhZyA9PSAxKSAmJiAoIChBc2ZIaW50Qml0ID09IDEpICYmIChJcG1pSGludEJpdCA9PSAwKSAmJiAoTm9IaW50Qml0ID09IDApICkgKSB7CgkJLyogd2UgYXJlIGluIHRoZSBBU0YgbW9kZSAqLwoJCQlpZiAoIChwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FQykgfHwKCQkJCShwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9ZMikgKSB7CgkJCQkvKiBBU0YgY2FuIHJ1biBvbiBZdWtvbkVDIGFuZCBZdWtvbjIgKi8KCQkJCXBBQy0+QXNmRGF0YS5PcE1vZGUgPSBTS19HRUFTRl9NT0RFX0FTRjsKCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJTa0FzZkluaXQ6ICoqKiBTS19HRUFTRl9NT0RFX0FTRiAqKipcbiIpKTsKCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgNSk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCQkJfQoJCX0gZWxzZSB7CgkJLyogYXJlIHdlIGluIHRoZSBpcG1pIG1vZGUgPyAqLwoJCQlpZiAoIChJcG1pRmxhZyA9PSAxKSAmJiAoIChJcG1pSGludEJpdCA9PSAxKSAmJiAoQXNmSGludEJpdCA9PSAwKSAmJiAoTm9IaW50Qml0ID09IDApICkgKSB7CgkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiKioqIElwbWkgYml0cyBPSyAtIENoaXBNb2RlOiAleCAqKipcbiIsIHBBQy0+QXNmRGF0YS5DaGlwTW9kZSkpOwoJCQkJaWYgKHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX1kyKSB7CgkJCQkJLyogSVBNSSBjYW4gcnVuIG9ubHkgb24gWXVrb24yICovCgkJCQkJcEFDLT5Bc2ZEYXRhLk9wTW9kZSA9IFNLX0dFQVNGX01PREVfSVBNSTsKCgkJCQkJLyogc2V0IEFTRiBlbmFibGUgYml0IGluIGdlbmVyYWwgcmVnaXN0ZXIgKDB4MDAwNCkKCQkJCQkgKiBhbmQgc2V0IHRoZSBBc2ZFbmFibGUgYnl0ZSBpbiBwQUMgc3RydWN0dXJlCgkJCQkJICogKHBBQy0+R0luaS5HSUFzZkVuYWJsZWQgPSBTS19UUlVFKQoJCQkJCSAqLwoJCQkJCUFzZkVuYWJsZShwQUMsIElvQyk7CgoJCQkJCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBkdWFsIHBvcnQgYWRhcHRlciAqLwoJCQkJCWlmICggKENISVBfSURfWVVLT05fMihwQUMpKSAmJiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpICkgewoJCQkJCQlwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPSBTS19HRUFTRl9ZMl9EVUFMUE9SVDsKCQkJCQl9IGVsc2UgewoJCQkJCQlwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPSBTS19HRUFTRl9ZMl9TSU5HTEVQT1JUOwoJCQkJCX0KCgkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAoJCQkJCQkoIlNrQXNmSW5pdDogKioqIFNLX0dFQVNGX01PREVfSVBNSSAoJWQpICoqKlxuIiwgcEFDLT5Bc2ZEYXRhLkR1YWxNb2RlKSk7CgojaWYgMAoJCQkJCS8qICBEaXNhYmxlIEFSUCBwYXR0ZXJuLCBPUyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZyAqLwoJCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgNSk7CgkJCQkJLy8gQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAwKTsKCgkJCQkJaWYgKHBBQy0+QXNmRGF0YS5EdWFsTW9kZSA9PSBTS19HRUFTRl9ZMl9EVUFMUE9SVCkgewoJCQkJCS8qIERpc2FibGUgQVJQIHBhdHRlcm4sIE9TIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgQVJQIGhhbmRsaW5nICovCgkJCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMSwgNSk7CgkJCQkJCS8vIEFzZlNldFVwUGF0dGVybihwQUMsIElvQywgMSk7CgkJCQkJfQojZW5kaWYKCQkJCX0KCQkJfQoJCX0KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkvLyAgcnVuIERhc2ggd2l0aG91dCBoaW50IGJpdAoJCWlmIChwQUMtPkFzZkRhdGEuT3BNb2RlID09IFNLX0dFQVNGX01PREVfVU5LTk9XTikgewoJCSAgaWYoICggIChwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FQyl8fCAKCQkJIChwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCkgICkgJiYgCgkJICAgICAgKEFzZkRhc2hGbGFnID09IDEpICYmIChOb0hpbnRCaXQgPT0gMSkgKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIEFTRiBjYW4gcnVuIG9uIFl1a29uRUMgd2l0aG91dCBoaW50IGJpdHMKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuT3BNb2RlID0gU0tfR0VBU0ZfTU9ERV9EQVNIOwogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfSU5JVCwgKCJTa0FzZkluaXQ6ICoqKiBTS19HRUFTRl9NT0RFX0RBU0ggRUMgKioqXG4iKSk7CgkJICAgIAoJCSAgICAvKiBUbyBlYXJseSwgd2UgbmVlZCB0byBkbyB0aGlzIGlmIGludGVyZmFjZSBpcyB1cCAqLwogICAgICAgICAgICAgICAgICAgIC8vIFlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fQVJQICk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAvLyBZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX0lDTVApOyAgLy8gIERpc2FibGUgSUNNUCBwYXR0ZXJuLCBPUyBpcyBub3cgcmVzcG9uc2libGUgZm9yIElDTVAgaGFuZGxpbmcKCQkgIH0KCQl9CiNlbmRpZgoKCQlpZiAocEFDLT5Bc2ZEYXRhLk9wTW9kZSA9PSBTS19HRUFTRl9NT0RFX1VOS05PV04pIHsKCQkJaWYoIChwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FQykgJiYgKEFzZkZsYWcgPT0gMSkgJiYgKE5vSGludEJpdCA9PSAxKSApIHsKCQkJLyogQVNGIGNhbiBydW4gb24gWXVrb25FQyB3aXRob3V0IGhpbnQgYml0cyAqLwoJCQkJcEFDLT5Bc2ZEYXRhLk9wTW9kZSA9IFNLX0dFQVNGX01PREVfQVNGOwoJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmSW5pdDogKioqIFNLX0dFQVNGX01PREVfQVNGIEVDICoqKlxuIikpOwoJCQkJWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA1KTsgIC8vICBEaXNhYmxlIEFSUCBwYXR0ZXJuLCBPUyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZwoJCQl9IGVsc2UgewoJCQkvKiBlcnJvciAtIHdlIGNvdWxkIG5vdCBmaW5kIG91ciBvcGVyYXRpb24gbW9kZSEgKi8KCQkJCXBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPSBBU0ZfSU5JVF9FUlJPUl9PUE1PREU7CgkJCQlSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX0dFTkVSQUw7CgkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZJbml0OiAqKiogQVNGL0lQTUkgVU5LTk9XTiBPUE1PREUgKioqXG4iKSk7CgoJCQkJQXNmRGlzYWJsZShwQUMsIElvQyk7ICAgIC8vIGRpc2FibGUgcGF0dGVybiBtYXRjaGluZyBmb3IgQVNGL0lQTUkKCgkJCQlBc2ZSZXNldENwdShwQUMsIElvQyk7ICAgICAgIC8vIHJlc2V0IGNwdQoKCQkJCS8qIGRpc2FibGUgYWxsIHBhdHRlcm4gZm9yIGFzZi9pcG1pICovCgkJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIDQpOwoJCQkJWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA1KTsKCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgNik7CgoJCQkJaWYgKCAoQ0hJUF9JRF9ZVUtPTl8yKHBBQykpICYmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgKSB7CgkJCQkvKiBkbyBub3QgZm9yZ2V0IHRoZSBzZWNvbmQgbGluawoJCQkJICogZGlzYWJsZSBhbGwgcGF0dGVybiBmb3IgYXNmL2lwbWkKCQkJCSAqLwoJCQkJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMSwgNCk7CgkJCQkJWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAxLCA1KTsKCQkJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDYpOwoJCQkJfQoJCQkJYnJlYWs7IC8vIGxlYXZlICJjYXNlIFNLX0lOSVRfSU8iCgkJCX0KCQl9CgoJCS8qIFNlbmQgQ2hlY2tBbGl2ZSBjb21tYW5kIHRvIENQVSAqLwoJCWlmICggKChwQUMtPkFzZkRhdGEuT3BNb2RlID09IFNLX0dFQVNGX01PREVfQVNGKSB8fAoJCSAgICAgIChwQUMtPkFzZkRhdGEuT3BNb2RlID09IFNLX0dFQVNGX01PREVfSVBNSSkgfHwKCQkgICAgICAocEFDLT5Bc2ZEYXRhLk9wTW9kZSA9PSBTS19HRUFTRl9NT0RFX0RBU0gpKSAmJgoJCSAgICAgKFJldENvZGUgPT0gU0tfQVNGX1BOTUlfRVJSX09LKSApIHsKCgkJICBpZiggQXNmQ2hlY2tBbGl2ZUNwdSggcEFDLCBJb0MgKSAhPSAxICkgIHsgLy8gIE5vdCBhbGl2ZQoJCSAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwoJCSAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZkluaXQ6ICogICAgIENQVSBpcyBOT1QgcnVubmluZyAhICAgKlxuIikpOwoJCSAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwoJCSAgICBwQUMtPkFzZkRhdGEuQ3B1QWxpdmUgPSAwOwoJCSAgfSBlbHNlICB7CgkJICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CgkJICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmSW5pdDogKiAgICAgICAgQ1BVIGlzIHJ1bm5pbmcgICAgICAqXG4iKSk7CgkJICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CgkJICAgIHBBQy0+QXNmRGF0YS5DcHVBbGl2ZSA9IDE7CgkJICAgIAojaWYgMAoJCSAgICBpZiggQXNmSGNpU2VuZENvbW1hbmQoIHBBQywgSW9DLCBZQVNGX0hPU1RDTURfRFJWX0hFTExPLCAwLCAwLCAwLCBBU0ZfSENJX1dBSVQsIDMgKSAhPSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKCQkgICAgICBwcmludGsoIkFTRjogRFJWX0hFTExPIGZhaWxlZFxuIik7CgkJICAgIH0gZWxzZSB7CgkJICAgICAgcHJpbnRrKCJBU0Y6IERSVl9IRUxMTyBPS1xuIik7CgkJICAgIH0KI2VuZGlmCgkJICB9CgkJfQoKCQkvKiBTVEFSVCBGTEFTSCBQUk9DICovCgkJLyogVHJ5IHRvIG9wZW4gdGhlIEZXIGltYWdlIGZpbGUgICAgKi8KCQlpZiAoZndfcmVhZChwQUMsRndGaWxlTmFtZVMxLCZwQXNmRndTMSwmRmlsZUxlbmd0aFMxKSAmJiAKCQkJZndfcmVhZChwQUMsRndGaWxlTmFtZVMyLCZwQXNmRndTMiwmRmlsZUxlbmd0aFMyKSkgewoJCQkvKiBTZXQgdGhlIGZsYXNoIG9mZnNldCB0byAxMjhrICovCgoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgRmxhc2ggZmlsZXMgb3BlbmVkOlxuIikpOwoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgICAgJXM6IHNpemU6IDB4JWQgb2ZmczoweCV4XG4iLCBGd0ZpbGVOYW1lUzEsIEZpbGVMZW5ndGhTMSwgRmxhc2hPZmZzZXQpKTsKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgICVzOiBzaXplOiAweCVkIG9mZnM6MHgleFxuIiwgRndGaWxlTmFtZVMyLCBGaWxlTGVuZ3RoUzIsIEZsYXNoT2Zmc2V0KSk7CgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCS8qICBjYWxjdWxhdGUgQ1Mgb2YgdGhlIEZXIGltYWdlICovCgkJCXBUbXAzMiA9IChTS19VMzIgKikgcEFzZkZ3UzE7CgkJCWZvciggaT0wLCBGd0NzPTA7IGk8QVNGX0RBU0hfRkxBU0hfU0laRV8xOyBpKz00ICkgIHsKCQkJICBGd0NzICs9ICpwVG1wMzI7CgkJCSAgcFRtcDMyKys7CgkJCX0KCgkJCXBUbXAzMiA9IChTS19VMzIgKikgcEFzZkZ3UzI7CgkJCWZvciggaT0wOyBpPEFTRl9EQVNIX0ZMQVNIX1NJWkVfMjsgaSs9NCApICB7CgkJCSAgRndDcyArPSAqcFRtcDMyOwoJCQkgIHBUbXAzMisrOwoJCQl9CiNlbHNlCgkJCS8qICBjYWxjdWxhdGUgQ1Mgb2YgdGhlIEZXIGltYWdlICovCgkJCXBUbXAzMiA9IChTS19VMzIgKikgcEFzZkZ3UzE7CgkJCWZvciggaT0wLCBGd0NzPTA7IGk8QVNGX0ZMQVNIX1NJWkU7IGkrPTQgKSAgewoJCQkJRndDcyArPSAqcFRtcDMyOwoJCQkJcFRtcDMyKys7CgkJCX0KCgkJCXBUbXAzMiA9IChTS19VMzIgKikgcEFzZkZ3UzI7CgkJCWZvciggaT0wOyBpPEFTRl9GTEFTSF9TSVpFOyBpKz00ICkgIHsKCQkJCUZ3Q3MgKz0gKnBUbXAzMjsKCQkJCXBUbXAzMisrOwoJCQl9CgojZW5kaWYKCgkJCWlmKCBGd0NzID09IDAgICkgIHsgIC8vICBDUyA9PSAwID0+IE8uSy4KCQkJCUZ3SW1hZ2VDc09rID0gMTsKCQkJCUZ3SW1hZ2VDcyA9ICoocFRtcDMyIC0gMSk7CgkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgRlcgSW1hZ2UgQ2hlY2tzdW0gTy5LLiBcbiIpKTsKCQkJfSBlbHNlICB7CgkJCQlwcmludGsoInNrOThsaW46IEZpbGUgRlcgQ2hlY2tzdW0gbm90IE9LXG4iKTsKCgkJCQlGd0ltYWdlQ3NPayA9IDA7CgkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEVycm9yOiBGVyBJbWFnZSBDaGVja3N1bToweCV4XG4iLCBGd0NzKSk7CgkJCX0KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJcEFDLT5Bc2ZEYXRhLkRyaXZlclZlcnNpb25bMF0gPSAndic7CgkJCXBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzFdID0gJzMnOwoJCQlwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvblsyXSA9ICcuJzsKCQkJcEFDLT5Bc2ZEYXRhLkRyaXZlclZlcnNpb25bM10gPSAnMCc7CgkJCXBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzRdID0gJzAnOwoKCQkJZm9yKCBpPTA7IGk8NTsgaSsrICkKCQkJCXBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uW2ldID0gKihwQXNmRndTMiArIEFTRl9GTEFTSF9FWF9PRkZTX1ZFUiAtIDY1NTM2ICsgaSk7CgoJCQlwQUMtPkFzZkRhdGEuRmlsZUZ3UmV2ID0gKihwQXNmRndTMiArIEFTRl9GTEFTSF9FWF9PRkZTX1JFViAtIDY1NTM2KTsKI2Vsc2UKCQkJcEFDLT5Bc2ZEYXRhLkRyaXZlclZlcnNpb25bMF0gPSAndic7CgkJCXBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzFdID0gJzEnOwoJCQlwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvblsyXSA9ICcuJzsKCQkJcEFDLT5Bc2ZEYXRhLkRyaXZlclZlcnNpb25bM10gPSAnMSc7CgkJCXBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzRdID0gJzAnOwoKCQkJZm9yKCBpPTA7IGk8NTsgaSsrICkKCQkJCXBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uW2ldID0gKihwQXNmRndTMiArIEFTRl9GTEFTSF9PRkZTX1ZFUiAtIDY1NTM2ICsgaSk7CgoJCQlwQUMtPkFzZkRhdGEuRmlsZUZ3UmV2ID0gKihwQXNmRndTMiArIEFTRl9GTEFTSF9PRkZTX1JFViAtIDY1NTM2KTsKI2VuZGlmCgkKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIEZXIEltYWdlOiVjJWMlYyVjICVjIERyaXZlcjolYyVjJWMlY1xuIiwKCQkJCQlwQUMtPkFzZkRhdGEuRmlsZUZ3VmVyc2lvblsxXSwgcEFDLT5Bc2ZEYXRhLkZpbGVGd1ZlcnNpb25bMl0sCgkJCQkJcEFDLT5Bc2ZEYXRhLkZpbGVGd1ZlcnNpb25bM10sIHBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uWzRdLAoJCQkJCXBBQy0+QXNmRGF0YS5GaWxlRndSZXYsCgkJCQkJcEFDLT5Bc2ZEYXRhLkRyaXZlclZlcnNpb25bMV0sIHBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzJdLAoJCQkJCXBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzNdLCBwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvbls0XSApKTsKCgoJCQkvKiBjaGVjaywgd2hldGhlciB0aGUgRlcgZmlsZSB2ZXJzaW9uIHN1aXRzIHRoZSBkcml2ZXIgdmVyc2lvbiAqLwoJCQlpZiggKHBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uWzFdID09IHBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzFdKSAmJgoJCQkJKHBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uWzNdID09IHBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzNdKSAmJgoJCQkJKHBBQy0+QXNmRGF0YS5GaWxlRndWZXJzaW9uWzRdID09IHBBQy0+QXNmRGF0YS5Ecml2ZXJWZXJzaW9uWzRdKSAmJgoJCQkJKEZ3SW1hZ2VDc09rID09IDEpICkgewoKCQkJCS8qIHJlYWQgdGhlIGZsYXNoICAodXBwZXIgMTI4aykgKi8KCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBGVyBzdWl0cyB0aGUgZHJpdmVytHMgdmVyc2lvblxuIikpOwoKCQkJCWlmKCBwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCApICB7CgkJCQkgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogRXh0cmVtZSAtPiBEbyBub3QgcmVzZXQgISFcbiIpKTsKCQkJCX0KCQkJCWVsc2UgaWYgKFl1a29uRWNBMSkgIHsgIC8vIHdhcyBpZiAocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSBDSElQX1JFVl9ZVV9FQ19BMSkgYmVmb3JlCgkJCQkgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogQ2hpcCBSZXYuIEExIC0+IERvIHJlc2V0ICEhXG4iKSk7CgkJCQkgIAkJCQkgIAoJCQkJICBBc2ZSZXNldENwdShwQUMsIElvQyk7CgoKCQkJCSAgLy8gQXNmU21hcnRSZXNldENwdSggcEFDLCBJb0MsIEFTRl9SRVNFVF9IT1QgKTsgIC8vIGZpeGVkIGluIEEyCgkJCQl9IGVsc2UgIHsKCQkJCQkvKgoJCQkJCSAqIGp1c3QgaW4gY2FzZSB0aGUgRlcgaXMgbm90IHJ1bm5pbmcgISEKCQkJCQkgKiAoc2hvdWxkbrR0IGhhcHBlbiB3aXRoIEEyIGFuZCBsYXRlciB2ZXJzaW9ucykKCQkJCQkgKi8KCQkJCQlpZiggIXBBQy0+QXNmRGF0YS5DcHVBbGl2ZSApICB7CgkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgKioqIEZXIGlzIG5vdCBydW5uaW5nICEhICAqKiogXG4iKSk7CgoJCQkJCQlBc2ZSZXNldENwdShwQUMsIElvQyk7CgkJCQkJCS8vIEFzZlNtYXJ0UmVzZXRDcHUoIHBBQywgSW9DLCBBU0ZfUkVTRVRfSE9UICk7CgkJCQkJCS8vIEFzZlJ1bkNwdSggSW9DICk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICghWXVrb25FY0ExKSB7CiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCSAgQXNmTG9ja1NwaSggcEFDLCBJb0MgKTsKI2Vsc2UKCQkJCSAgU0tfT1VUOChJb0MsIEdQSFlfQ1RSTCArIDIsIDEpOyAgLy8gIExvY2sgdGhlIFNQSSBhY2Nlc3MKI2VuZGlmCgkJCQl9CgoJCQkJc3BpX2luaXRfcGFjKCBwQUMgKTsKCgkJCQlpZiAoIWZsYXNoX2NoZWNrX3NwaSggJkZsYXNoU2l6ZSApKSB7CiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCSAgcHJpbnRrKCJzazk4bGluOiBTUEkgbm90IHByZXNlbnQhXG4iKTsKI2VuZGlmCgkJCQl9CgkJCQllbHNlIHsKCQkJCSAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIEZsYXNoIGZvdW5kIHdpdGggc2l6ZSBvZiAlZCBLQnl0ZXNcbiIsIEZsYXNoU2l6ZS8xMDI0KSk7CgkJCQl9CgoJCQkJLyogUmVhZCBmbGFzaCBsb3cgcGFnZXMgKi8JCQkJCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCUZ3Q3MgPSAwOwoKCQkJCVNwaVJldFZhbCA9IHNwaV9mbGFzaF9tYW5hZ2UoIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlciwgQVNGX0ZMQVNIX0VYX09GRlMsIEFTRl9EQVNIX0ZMQVNIX1NJWkVfMSwgU1BJX1JFQUQgKTsKCgkJCQlwVG1wMzIgPSAoU0tfVTMyICopIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcjsKCQkJCWZvciggaT0wOyBpPCBBU0ZfREFTSF9GTEFTSF9TSVpFXzE7IGkrPTQgKSAgewoJCQkJICBGd0NzICs9ICpwVG1wMzI7CgkJCQkgIHBUbXAzMisrOwoJCQkJfQojZWxzZQoJCQkJU3BpUmV0VmFsID0gc3BpX2ZsYXNoX21hbmFnZSggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyLCBBU0ZfRkxBU0hfT0ZGUywgQVNGX0ZMQVNIX1NJWkUsIFNQSV9SRUFEICk7CgoJCQkJaWYoIFNwaVJldFZhbCA9PSAwICkgIHsKCQkJCS8qIGNhbGN1bGF0ZSBDUyBvZiB0aGUgRlcgZmxhc2ggKi8KCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEZsYXNoIGxvdyBwYWdlcyBsb2FkZWQuIENhbGN1bGF0ZSB0aGUgQ1Mgb2YgdGhlIEZXIGZsYXNoLlxuIikpOwoKCQkJCQlwVG1wMzIgPSAoU0tfVTMyICopIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcjsKCQkJCQlmb3IoIGk9MCwgRndDcz0wOyBpPEFTRl9GTEFTSF9TSVpFOyBpKz00ICkgIHsKCQkJCQkJRndDcyArPSAqcFRtcDMyOwoJCQkJCQlwVG1wMzIrKzsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogRXJyb3I6IFNQSSByZWFkXG4iKSk7CgkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9BU0ZfRTAwMiwgU0tFUlJfQVNGX0UwMDJNU0cpOwoJCQkJCVJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTDsKCQkJCX0KI2VuZGlmCgoKI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCQkJaWYoIFNwaVJldFZhbCA9PSAwICkgIHsKCQkJCX0gZWxzZSB7CgkJCQkgIFJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTDsKCQkJCX0KI2VuZGlmCgoJCQkJLyogUmVhZCBmbGFzaCBoaWdoIHBhZ2VzICovCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCVNwaVJldFZhbCA9IHNwaV9mbGFzaF9tYW5hZ2UoIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlciwgQVNGX0ZMQVNIX0VYX09GRlMgKyA2NTUzNiwgQVNGX0RBU0hfRkxBU0hfU0laRV8yLCBTUElfUkVBRCApOwojZWxzZQoJCQkJU3BpUmV0VmFsID0gc3BpX2ZsYXNoX21hbmFnZSggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyLCBBU0ZfRkxBU0hfT0ZGUyArIDY1NTM2LCBBU0ZfRkxBU0hfU0laRSwgU1BJX1JFQUQgKTsKI2VuZGlmCgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQlpZiggU3BpUmV0VmFsID09IDAgKSAgewoJCQkJfSBlbHNlIHsKCQkJCSAgUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJfQojZW5kaWYKCgkJCQlpZiAoIVl1a29uRWNBMSkgewojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkgIEFzZlVubG9ja1NwaSggcEFDLCBJb0MgKTsKI2Vsc2UKCQkJCSAgU0tfT1VUOChJb0MsIEdQSFlfQ1RSTCArIDIsIDApOyAgLy8gIFVubG9jayB0aGUgU1BJIGFjY2VzcwojZW5kaWYKCQkJCX0KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCWlmKCBwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCApICB7CQkJCQkJCQoJCQkJICBBc2ZSdW5DcHUoIHBBQywgSW9DICk7CgkJCQl9CiNlbmRpZgoKCgkJCQlpZiAoKCBTcGlSZXRWYWwgPT0gMCApICYmICghUmV0Q29kZSkpIHsKCQkJCS8qIGNhbGN1bGF0ZSBDUyBvZiB0aGUgRlcgZmxhc2ggKi8KCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEZsYXNoIGhpZ2ggcGFnZXMgbG9hZGVkLiBDYWxjdWxhdGUgdGhlIENTIG9mIHRoZSBGVyBmbGFzaC5cbiIpKTsKCQkJCQlwVG1wMzIgPSAoU0tfVTMyICopIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcjsKI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCQkJCWZvciggaT0wOyBpPCBBU0ZfREFTSF9GTEFTSF9TSVpFXzI7IGkrPTQgKSAgewojZWxzZQoJCQkJCWZvciggaT0wOyBpPEFTRl9GTEFTSF9TSVpFOyBpKz00ICkgIHsKI2VuZGlmCQkJCQkKCQkJCQkJRndDcyArPSAqcFRtcDMyOwoJCQkJCQlwVG1wMzIrKzsKCQkJCQl9CgoJCQkJCWlmKCBGd0NzID09IDAgICkgIHsgIC8vICBDUyA9PSAwID0+IE8uSy4KCQkJCQkJRndGbGFzaENzT2sgPSAxOwoJCQkJCQlGd0ZsYXNoQ3MgPSAqKHBUbXAzMiAtIDEpOwoJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgRlcgRmxhc2ggQ2hlY2tzdW0gTy5LLiBcbiIpKTsKCQkJCQl9IGVsc2UgIHsKCQkJCQkJRndGbGFzaENzT2sgPSAwOwojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJCXByaW50aygic2s5OGxpbjogQ2hpcCBGVyBDaGVja3N1bSBub3QgT0tcbiIpOwojZW5kaWYJCQkJCQkKCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogRlcgRmxhc2ggQ2hlY2tzdW06MHgleFxuIiwgRndDcykpOwoJCQkJCX0KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkvKiByZWFkIHRoZSBGVyBmbGFzaCB2ZXJzaW9uL3JldiAqLwoJCQkJCWZvciggaT0wOyBpPDU7IGkrKyApIHsKCQkJCQkJcEFDLT5Bc2ZEYXRhLkZsYXNoRndWZXJzaW9uW2ldID0gIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltBU0ZfRkxBU0hfRVhfT0ZGU19WRVIgLSA2NTUzNiArIGldOwoJCQkJCX0KCgkJCQkJcEFDLT5Bc2ZEYXRhLkZsYXNoRndSZXYgPSBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXJbQVNGX0ZMQVNIX0VYX09GRlNfUkVWIC0gNjU1MzYgXTsKCgkJCQkJLyogcmVhZCB0aGUgR1VJRCBmcm9tIGZsYXNoICovCgkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgKioqIEdVSUQgKioqXG4iKSk7CgkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICIpKTsKCQkJCQlmb3IoIGk9MDsgaTwxNjsgaSsrICkgewoJCQkJCQlwQUMtPkFzZkRhdGEuTWliLkd1aWRbaV0gPSAgcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW0FTRl9GTEFTSF9FWF9PRkZTX0dVSUQgLSA2NTUzNiAraV07CgkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiV4ICIsIHBBQy0+QXNmRGF0YS5NaWIuR3VpZFtpXSkpOwoJCQkJCQlPbGRHdWlkW2ldID0gcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW0FTRl9GTEFTSF9FWF9PRkZTX0dVSUQgLSA2NTUzNiAraV07CgkJCQkJfQoJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlxuIikpOwoJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBGVyBGbGFzaDo+PiVjJWMlYyVjICVjPDxcbiIsCgkJCQkJCXBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvblsxXSwgcEFDLT5Bc2ZEYXRhLkZsYXNoRndWZXJzaW9uWzJdLAoJCQkJCQlwQUMtPkFzZkRhdGEuRmxhc2hGd1ZlcnNpb25bM10sIHBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvbls0XSwKCQkJCQkJcEFDLT5Bc2ZEYXRhLkZsYXNoRndSZXYgKSk7CiNlbHNlCgkJCQkJLyogcmVhZCB0aGUgRlcgZmxhc2ggdmVyc2lvbi9yZXYgKi8KCQkJCQlmb3IoIGk9MDsgaTw1OyBpKysgKSB7CgkJCQkJCXBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvbltpXSA9ICBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXJbQVNGX0ZMQVNIX09GRlNfVkVSIC0gNjU1MzYgKyBpXTsKCQkJCQl9CgoJCQkJCXBBQy0+QXNmRGF0YS5GbGFzaEZ3UmV2ID0gcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW0FTRl9GTEFTSF9PRkZTX1JFViAtIDY1NTM2IF07CgoJCQkJCS8qIHJlYWQgdGhlIEdVSUQgZnJvbSBmbGFzaCAqLwoJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICoqKiBHVUlEICoqKlxuIikpOwoJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAiKSk7CgkJCQkJZm9yKCBpPTA7IGk8MTY7IGkrKyApIHsKCQkJCQkJcEFDLT5Bc2ZEYXRhLk1pYi5HdWlkW2ldID0gIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltBU0ZfRkxBU0hfT0ZGU19HVUlEIC0gNjU1MzYgK2ldOwoJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIleCAiLCBwQUMtPkFzZkRhdGEuTWliLkd1aWRbaV0pKTsKCQkJCQkJT2xkR3VpZFtpXSA9IHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltBU0ZfRkxBU0hfT0ZGU19HVUlEIC0gNjU1MzYgK2ldOwoJCQkJCX0KCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJcbiIpKTsKCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgRlcgRmxhc2g6Pj4lYyVjJWMlYyAlYzw8XG4iLAoJCQkJCQlwQUMtPkFzZkRhdGEuRmxhc2hGd1ZlcnNpb25bMV0sIHBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvblsyXSwKIAkJCQkJCXBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvblszXSwgcEFDLT5Bc2ZEYXRhLkZsYXNoRndWZXJzaW9uWzRdLAoJCQkJCQlwQUMtPkFzZkRhdGEuRmxhc2hGd1JldiApKTsKI2VuZGlmCgoKI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwojaWZkZWYgRk9SQ0VfRldfRkxBU0gKCQkJCQkvLyBGbGFzaCB0aG91Z2ggRmxhc2ggVmVyc2lvbiBhbHJlYWR5IHRoZSBDaGlwIGFuZCBGbGFzaCBWZXJzaW9uIG9mIERyaXZlciBhcmUgdGhlIHNhbWUKCQkJCQlwQUMtPkFzZkRhdGEuRmlsZUZ3UmV2ID0gJ3gnOwojZW5kaWYKI2VuZGlmCgoJCQkJCS8qIGNoZWNrIHRoZSBGVyB2ZXJzaW9uL3JldiBhbmQgdXBkYXRlIHRoZSBmbGFzaCBpZiBuZWNlc3NhcnkgKi8KCQkJCQlpZiggKHBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvblsxXSAhPSBwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvblsxXSkgfHwKCQkJCQkJKHBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvblszXSAhPSBwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvblszXSkgfHwKCQkJCQkJKHBBQy0+QXNmRGF0YS5GbGFzaEZ3VmVyc2lvbls0XSAhPSBwQUMtPkFzZkRhdGEuRHJpdmVyVmVyc2lvbls0XSkgfHwKCQkJCQkJKHBBQy0+QXNmRGF0YS5GbGFzaEZ3UmV2ICE9IHBBQy0+QXNmRGF0YS5GaWxlRndSZXYpICAgICAgICAgICAgICAgfHwKCQkJCQkJKHBBQy0+QXNmRGF0YS5GaWxlRndSZXYgPT0gJ3gnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAvLyBSZXYgPT0gJ3gnIG1lYW5zOiBkbyBhbGx3YXlzIGEgZmxhc2ggdXBkYXRlICEgKGZvciB0ZXN0IHB1cnBvc2VzKQoJCQkJCQkoRndGbGFzaENzT2sgIT0gMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tzdW0gZXJyb3IgaW4gZmxhc2gKCQkJCQl7CgkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBVcGRhdGluZyBmbGFzaFxuIikpOwoJCQkJCQkvLyBBc2ZSZXNldENwdSggcEFDLCBJb0MgKTsKCQkJCQkJZm9yKCBpPTA7IGk8QVNGX0ZMQVNIX1NJWkU7IGkrKyApCgkJCQkJCQlwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXJbaV0gPSAqKHBBc2ZGd1MxICsgRmxhc2hPZmZzZXQgKyBpKTsKCgkJCQkJCS8qIGZsYXNoIGVyYXNlLCBkZXRlcm1pbmUgZmxhc2ggc2l6ZSBhbmQgc2VsZWN0IGFyZWEgdG8gYmUgZXJhc2VkICovCgkJCQkJCXN3aXRjaCAoRmxhc2hTaXplKSB7CgkJCQkJCQljYXNlIEFTRl9GTEFTSF9TSVpFICogNDoJLyogMjU2IGtCICovCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkJCSAgICAgICBGbGFzaE9mZnNldCA9IEFTRl9GTEFTSF9FWF9PRkZTOwogCQkJCQkJCQlFcmFzZU9mZiA9IEFTRl9GTEFTSF9FWF9PRkZTOwojZWxzZQoJCQkJCQkJCUVyYXNlT2ZmID0gQVNGX0ZMQVNIX09GRlM7CiNlbmRpZgoKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgQVNGX0ZMQVNIX1NJWkUgKiAyOgkvKiAxMjgga0IgKi8KI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCQkJCQkJICAgICAgICBGbGFzaE9mZnNldCA9IDA7CiNlbmRpZgoJCQkJCQkJCUVyYXNlT2ZmID0gMDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWRlZmF1bHQ6CQkJLyogdW5zdXBwb3J0ZWQgKi8KCQkJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgVW5zdXBwb3J0ZWQgRmxhc2ggU2l6ZTogJWx1XG4iLCBGbGFzaFNpemUgKSk7CgkJCQkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJCQkJcHJpbnRrKCJzazk4bGluOiBGbGFzaCBTaXplIG5vdCBzdXBwb3J0ZWRcbiIpOwojZW5kaWYKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlpZiAoIVJldENvZGUpCgkJCQkJCQlEb1VwZGF0ZSA9IFNLX1RSVUU7CgkJCQkJfSBlbHNlICB7CgkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBGbGFzaCBpcyB1cCB0byBkYXRlXG4iKSk7CiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkJcHJpbnRrKCJzazk4bGluOiBGbGFzaCBpcyB1cCB0byBkYXRlXG4iKTsKI2VuZGlmCgkJCQkJCQoJCQkJCX0KCgoKCQkJCQlpZiAoRG9VcGRhdGUpIHsKCQkJCQkgICAgICAgIC8qIFRoaXMgaGFuZ3MgdGhlIENQVSBpbiBjYXNlIHdlIGRvIE5PVCBmbGFzaCAqLwoJCQkJCSAgICAgICAgLyogU28gd2UgZGVmZXIgaXQgdG8gdGhpcyBwb2ludCB3aGVyZSB3ZSBhcmUgKi8KICAJCQkJCSAgICAgICAgLyogc3VyZSB3ZSB3aWxsIGZsYXNoLiAqLwojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJICAgICAgICBBc2ZTbWFydFJlc2V0Q3B1KCBwQUMsIElvQywgQVNGX1JFU0VUX0NPTEQgKTsKI2VuZGlmCgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJICAgICAgICBwcmludGsoInNrOThsaW46IFN0YXJ0aW5nIHRoZSBmbGFzaCBwcm9jZXNzXG4iKTsKI2VuZGlmCgkJCQkJCQkKCQkJCQkJaWYgKHNwaV9mbGFzaF9lcmFzZSggRXJhc2VPZmYsIEFTRl9GTEFTSF9TSVpFICogMikgPT0gMCApIHsKCQkJCQkJCS8qCgkJCQkJCQkgKiBIYW5kbGUgc2VjdG9yIDEKCQkJCQkJCSAqIChmaXJzdCBmbGFzaCBmaWxlKQoJCQkJCQkJICovCgkJCQkJCQkvKiAgd3JpdGUgc2VjdG9yIDEgYnVmZmVyIHRvIGZsYXNoIGFuZCBjaGVjayB0aGUgYnVmZmVyICovCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkJCWlmIChzcGlfZmxhc2hfbWFuYWdlKCBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXIsIEZsYXNoT2Zmc2V0LCBBU0ZfREFTSF9GTEFTSF9TSVpFXzEsIFNQSV9XUklURSApID09IDAgKSB7CgkJCQkJCQkJLyogIHJlYWQgYnVmZmVyIGJhY2sgKi8KCQkJCQkJCQlpZiggc3BpX2ZsYXNoX21hbmFnZSggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyLCBGbGFzaE9mZnNldCwgQVNGX0RBU0hfRkxBU0hfU0laRV8xLCBTUElfUkVBRCApID09IDAgKSAgewoJCQkJCQkJCSAgLyogIGNvbXBhcmUgYnVmZmVyIHdpdGggY29udGVudCBvZiBmbGFzaCBpbWFnZSBmaWxlICAqLwoJCQkJCQkJCSAgZm9yKCBpPTAsRmxhc2hPaz0xOyBpPEFTRl9EQVNIX0ZMQVNIX1NJWkVfMTsgaSsrICkgIHsKCQkJCQkJCQkgICAgaWYoIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltpXSAhPSAqKHBBc2ZGd1MxICsgaSkgKSB7CgkJCQkJCQkJICAgICAgRmxhc2hPayA9IDA7CgkJCQkJCQkJICAgIH0KCQkJCQkJCQkgIH0KI2Vsc2UKCQkJCQkJCWlmIChzcGlfZmxhc2hfbWFuYWdlKCBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXIsIEFTRl9GTEFTSF9PRkZTLCBBU0ZfRkxBU0hfU0laRSwgU1BJX1dSSVRFICkgPT0gMCApIHsKCQkJCQkJCQkvKiAgcmVhZCBidWZmZXIgYmFjayAqLwoJCQkJCQkJCWlmKCBzcGlfZmxhc2hfbWFuYWdlKCBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXIsIEFTRl9GTEFTSF9PRkZTLCBBU0ZfRkxBU0hfU0laRSwgU1BJX1JFQUQgKSA9PSAwICkgIHsKCQkJCQkJCQkJLyogIGNvbXBhcmUgYnVmZmVyIHdpdGggY29udGVudCBvZiBmbGFzaCBpbWFnZSBmaWxlICAqLwoJCQkJCQkJCQlmb3IoIGk9MCxGbGFzaE9rPTE7IGk8QVNGX0ZMQVNIX1NJWkU7IGkrKyApICB7CgkJCQkJCQkJCQlpZiggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW2ldICE9ICoocEFzZkZ3UzEgKyBGbGFzaE9mZnNldCArIGkpICkKCQkJCQkJCQkJCQlGbGFzaE9rID0gMDsKCQkJCQkJCQkJfQojZW5kaWYKCQkJCQkJCQkJCgoJCQkJCQkJCQlpZiggRmxhc2hPayAgKSAgewoJCQkJCQkJCQkvKiByZWFkIHRoZSBHVUlEIGZyb20gZmxhc2ggKi8KI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCQkJCQkJCQkgIHByaW50aygic2s5OGxpbjogRmxhc2ggUGFydCAxIHN1Y2NlZWRlZFxuIik7CiNlbmRpZgoJCQkJCQkJCQkKCQkJCQkJCQkJICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIEZsYXNoIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIChTZWN0b3IxKVxuIikpOwoJCQkJCQkJCQl9IGVsc2UgIHsKI2lmZGVmIFVTRV9BU0ZfREFTSF9GVwoJCQkJCQkJCQkgIHByaW50aygic2s5OGxpbjogRmxhc2ggUGFydCAxIGRpZCBub3Qgc3VjY2VlZFxuIik7CiNlbmRpZgkJCQkJCQkJCQoJCQkJCQkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogY29tcGFyZSBmbGFzaCBjb250ZW50IChTZWN0b3IxKVxuIikpOwoJCQkJCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9BU0ZfRTAwNywgU0tFUlJfQVNGX0UwMDdNU0cpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfSBlbHNlICB7CgkJCQkJCQkJCVJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTDsKCQkJCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogRmxhc2ggcmVyZWFkIChTZWN0b3IxKVxuIikpOwoJCQkJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0FTRl9FMDA2LCBTS0VSUl9BU0ZfRTAwNk1TRyk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlICB7CgkJCQkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogRXJyb3I6IEZsYXNoIHdyaXRlIChTZWN0b3IxKVxuIikpOwoJCQkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfQVNGX0UwMDQsIFNLRVJSX0FTRl9FMDA0TVNHKTsKCQkJCQkJCX0KCgoJCQkJCQkJLyoKCQkJCQkJCSAqIEhhbmRsZSBzZWN0b3IgMgoJCQkJCQkJICogKHNlY29uZCBmbGFzaCBmaWxlKQoJCQkJCQkJICovCgkJCQkJCQlGbGFzaE9rID0gMTsKCQkJCQkJCWZvciggaT0wOyBpPEFTRl9GTEFTSF9TSVpFOyBpKysgKQojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJCQkJcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW2ldID0gKihwQXNmRndTMiArIGkpOwojZWxzZQoJCQkJCQkJCXBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltpXSA9ICoocEFzZkZ3UzIgKyBGbGFzaE9mZnNldCArIGkpOwojZW5kaWYKCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkJCS8qICB3cml0ZSBzZWN0b3IgMiBidWZmZXIgdG8gZmxhc2ggYW5kIGNoZWNrIHRoZSBidWZmZXIgKi8KCQkJCQkJCWlmIChzcGlfZmxhc2hfbWFuYWdlKCBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXIsIEZsYXNoT2Zmc2V0ICsgQVNGX0RBU0hfRkxBU0hfU0laRV8xLCBBU0ZfREFTSF9GTEFTSF9TSVpFXzIsIFNQSV9XUklURSApID09IDAgKSB7CgkJCQkJCQkJLyogIHJlYWQgYnVmZmVyIGJhY2sgKi8KCQkJCQkJCQlpZiggc3BpX2ZsYXNoX21hbmFnZSggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyLCBGbGFzaE9mZnNldCArIEFTRl9EQVNIX0ZMQVNIX1NJWkVfMSwgQVNGX0RBU0hfRkxBU0hfU0laRV8yLCBTUElfUkVBRCApID09IDAgKSAgewoJCQkJCQkJCQkvKiAgY29tcGFyZSBidWZmZXIgd2l0aCBjb250ZW50IG9mIGZsYXNoIGltYWdlIGZpbGUgICovCgkJCQkJCQkJCWZvciggaT0wLEZsYXNoT2s9MTsgaTxBU0ZfREFTSF9GTEFTSF9TSVpFXzI7IGkrKyApICB7CgkJCQkJCQkJCQlpZiggcEFDLT5Bc2ZEYXRhLkZsYXNoQnVmZmVyW2ldICE9ICoocEFzZkZ3UzIgKyBpKSApCgkJCQkJCQkJCQkJRmxhc2hPayA9IDA7CgkJCQkJCQkJCX0KI2Vsc2UKCQkJCQkJCS8qICB3cml0ZSBzZWN0b3IgMiBidWZmZXIgdG8gZmxhc2ggYW5kIGNoZWNrIHRoZSBidWZmZXIgKi8KCQkJCQkJCWlmIChzcGlfZmxhc2hfbWFuYWdlKCBwQUMtPkFzZkRhdGEuRmxhc2hCdWZmZXIsIEFTRl9GTEFTSF9PRkZTICsgNjU1MzYsIEFTRl9GTEFTSF9TSVpFLCBTUElfV1JJVEUgKSA9PSAwICkgewoJCQkJCQkJCS8qICByZWFkIGJ1ZmZlciBiYWNrICovCgkJCQkJCQkJaWYoIHNwaV9mbGFzaF9tYW5hZ2UoIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlciwgQVNGX0ZMQVNIX09GRlMgKyA2NTUzNiwgQVNGX0ZMQVNIX1NJWkUsIFNQSV9SRUFEICkgPT0gMCApICB7CgkJCQkJCQkJCS8qICBjb21wYXJlIGJ1ZmZlciB3aXRoIGNvbnRlbnQgb2YgZmxhc2ggaW1hZ2UgZmlsZSAgKi8KCQkJCQkJCQkJZm9yKCBpPTAsRmxhc2hPaz0xOyBpPEFTRl9GTEFTSF9TSVpFOyBpKysgKSAgewoJCQkJCQkJCQkJaWYoIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltpXSAhPSAqKHBBc2ZGd1MyICtGbGFzaE9mZnNldCArIGkpICkKCQkJCQkJCQkJCQlGbGFzaE9rID0gMDsKCQkJCQkJCQkJfQojZW5kaWYKCgkJCQkJCQkJCWlmKCBGbGFzaE9rICApICB7CiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQkJCQkJCQkJICBwcmludGsoInNrOThsaW46IEZsYXNoIFBhcnQgMiBzdWNjZWVkZWRcbiIpOwojZW5kaWYKCgkJCQkJCQkJCS8qIHJlYWQgdGhlIEdVSUQgZnJvbSBmbGFzaCAqLwoJCQkJCQkJCQkJZm9yKCBpPTA7IGk8MTY7IGkrKyApCgkJCQkJCQkJCQkJcEFDLT5Bc2ZEYXRhLk1pYi5HdWlkW2ldID0gIHBBQy0+QXNmRGF0YS5GbGFzaEJ1ZmZlcltBU0ZfRkxBU0hfT0ZGU19HVUlEIC0gNjU1MzYgK2ldOwoKCQkJCQkJCQkJCS8qIGNoZWNrIGlmIG5ldyBHVUlEICovCgkJCQkJCQkJCQlmb3IoIGk9MDsgaTwxNjsgaSsrKSB7CgkJCQkJCQkJCQkJaWYoT2xkR3VpZFtpXSAhPSBwQUMtPkFzZkRhdGEuTWliLkd1aWRbaV0pIHsKCQkJCQkJCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICoqKiBORVcgR1VJRCAoJXgpKioqXG4iLCBwQUMtPkFzZkRhdGEuTWliLkd1aWRbaV0pKTsKCQkJCQkJCQkJCQkJcEFDLT5Bc2ZEYXRhLk5ld0d1aWQgPSAxOwoJCQkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgRmxhc2ggc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgKFNlY3RvcjIpXG4iKSk7CgkJCQkJCQkJCX0gZWxzZSAgewojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJCQkJCQkJCSAgcHJpbnRrKCJzazk4bGluOiBGbGFzaCBQYXJ0IDIgZGlkIG5vdCBzdWNjZWVkXG4iKTsKI2VuZGlmCgkJCQkJCQkJCQoJCQkJCQkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogY29tcGFyZSBmbGFzaCBjb250ZW50IChTZWN0b3IyKVxuIikpOwoJCQkJCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9BU0ZfRTAwNywgU0tFUlJfQVNGX0UwMDdNU0cpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfSBlbHNlICB7CgkJCQkJCQkJCVJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTDsKCQkJCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogRmxhc2ggcmVyZWFkIChTZWN0b3IyKVxuIikpOwoJCQkJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0FTRl9FMDA2LCBTS0VSUl9BU0ZfRTAwNk1TRyk7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlICB7CgkJCQkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogRXJyb3I6IEZsYXNoIHdyaXRlIChTZWN0b3IyKVxuIikpOwoJCQkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfQVNGX0UwMDQsIFNLRVJSX0FTRl9FMDA0TVNHKTsKCQkJCQkJCX0KCQkJCQkJfSBlbHNlICB7CgkJCQkJCQlSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX0dFTkVSQUw7CgkJCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEVycm9yOiBGbGFzaCBlcmFzZVxuIikpOwoJCQkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9BU0ZfRTAwMywgU0tFUlJfQVNGX0UwMDNNU0cpOwoJCQkJCQl9CgkJCQkJCS8qIHdyaXRlIHBhdHRlcm4gZXRjLiAqLwoJCQkJCQlpZiAocEFDLT5Bc2ZEYXRhLk9wTW9kZSA9PSBTS19HRUFTRl9NT0RFX0lQTUkpIHsKCQkJCQkJCS8qIGlwbWkgb24geXVrb24yICovCgkJCQkJCQlBc2ZTZXRVcFBhdHRlcm4ocEFDLCBJb0MsIDApOwoJCQkJCQkJaWYgKHBBQy0+QXNmRGF0YS5EdWFsTW9kZSA9PSBTS19HRUFTRl9ZMl9EVUFMUE9SVCkgewoJCQkJCQkJCUFzZlNldFVwUGF0dGVybihwQUMsIElvQywgMSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCS8qIHJ1biBjcHUgKi8KCQkJCQkJQXNmUnVuQ3B1KCBwQUMsIElvQyApOwoJCQkJCX0gLyogaWYgRG9VcGRhdGUgKi8KCQkJCX0gZWxzZSB7CgkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBFcnJvcjogU1BJIHJlYWRcbiIpKTsKCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0FTRl9FMDAyLCBTS0VSUl9BU0ZfRTAwMk1TRyk7CgkJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQkJfQoJCQl9CgoJCQkvKiBDbGVhciB0aGUgYnVmZmVyICovCgkJCWlmIChwQXNmRndTMSAhPSBOVUxMKQoJCQkJa2ZyZWUocEFzZkZ3UzEpOwoJCQlpZiAocEFzZkZ3UzIgIT0gTlVMTCkKCQkJCWtmcmVlKHBBc2ZGd1MyKTsKCQl9CgoJCWJyZWFrOwoKCWNhc2UgU0tfSU5JVF9SVU46CgkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZJbml0OiBTS19JTklUX1JVTlxuIikpOwoKCQlpZiggcEFDLT5Bc2ZEYXRhLkluaXRTdGF0ZSAhPSBBU0ZfSU5JVF9VTkRFRklORUQgKSB7CgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJICAvKiBXZSBuZWVkIHRvIHJlZW5hYmxlIHRoZSBPUyBoZXJlIGFuZCB0aGUgQVJQcyBkb25lIGJ5IHRoZSBIT1NUICovCgkJICAvKiBhcyB3ZSB3aWxsIGxlYXZlIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgd2l0aCBxdWljayBicmVhayovCgoJCSAgLyogIFNldCBPUyBQcmVzZW50IEZsYWcgaW4gQVNGIFN0YXR1cyBhbmQgQ29tbWFuZCBSZWdpc3RlciAqLwoJCSAgQXNmU2V0T3NQcmVzZW50Qml0KCBwQUMsIElvQyApOwoKCQkgIC8qICBEaXNhYmxlIEFSUCBwYXR0ZXJuLCBob3N0IHN5c3RlbSB0YWtlcyBvdmVyIHRoZSBBUlAgaGFuZGxpbmcgKi8KCQkgIFlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fQVJQICk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCQkgIFlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fSUNNUCk7ICAvLyAgRGlzYWJsZSBJQ01QIHBhdHRlcm4sIE9TIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgSUNNUCBoYW5kbGluZwoJCSAgWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCBBU0ZfREFTSF9QQVRURVJOX05VTV9TTk1QICk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBTTk1QIGhhbmRsaW5nCgoJCSAgQXNmRGlzYWJsZUZsdXNoRmlmbyggcEFDLCBJb0MgKTsKCgkJICBBc2ZIY2lTZW5kQ29tbWFuZCggcEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9EUlZfSEVMTE8sIDAsIDAsIDAsIEFTRl9IQ0lfV0FJVCwgMyApOwojZW5kaWYKCQkgIAoJCSAgYnJlYWs7CgkJfQoJCQojaWZuZGVmIFVTRV9BU0ZfREFTSF9GVwoJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgNSk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCgkJaWYgKHBBQy0+QXNmRGF0YS5EdWFsTW9kZSA9PSBTS19HRUFTRl9ZMl9EVUFMUE9SVCkgewoJCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDUpOyAgLy8gIERpc2FibGUgQVJQIHBhdHRlcm4sIE9TIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgQVJQIGhhbmRsaW5nCgkJfQojZW5kaWYKCgkJLyogd3JpdGUgcGF0dGVybiBldGMuICovCgkJaWYgKHBBQy0+QXNmRGF0YS5PcE1vZGUgPT0gU0tfR0VBU0ZfTU9ERV9JUE1JKSB7CgkJLy8gaXBtaSBvbiB5dWtvbjIKCQkJQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAwKTsKCQkJaWYgKHBBQy0+QXNmRGF0YS5EdWFsTW9kZSA9PSBTS19HRUFTRl9ZMl9EVUFMUE9SVCkgewoJCQkJQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAxKTsKCQkJfQoJCX0KCgkJaWYoICFwQUMtPkFzZkRhdGEuQ3B1QWxpdmUgKSAgewoJCSAgQXNmUmVzZXRDcHUocEFDLCBJb0MpOwoJCSAgQXNmUnVuQ3B1KCBwQUMsIElvQyApOwoJCX0KCgkJLyogIEFTRiBNSUIgcGFyYW1ldGVyIHRvIGRlZmF1bHQgdmFsdWVzICovCgkJcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNYXggICAgICAgICAgPSBBU0ZfREVGX1dBVENIRE9HX1RJTUVfTUFYOwoJCXBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lTWluICAgICAgICAgID0gQVNGX0RFRl9XQVRDSERPR19USU1FX01JTjsKCQlwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNDb3VudE1pbiAgICA9IEFTRl9ERUZfUkVUUkFOU19DT1VOVF9NSU47CgkJcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zQ291bnRNYXggICAgPSBBU0ZfREVGX1JFVFJBTlNfQ09VTlRfTUFYOwoJCXBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludE1pbiAgICAgID0gQVNGX0RFRl9SRVRSQU5TX0lOVF9NSU47CgkJcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50TWF4ICAgICAgPSBBU0ZfREVGX1JFVFJBTlNfSU5UX01BWDsKCQlwQUMtPkFzZkRhdGEuTWliLkhiSW50TWluICAgICAgICAgICA9IEFTRl9ERUZfSEJfSU5UX01JTjsKCQlwQUMtPkFzZkRhdGEuTWliLkhiSW50TWF4ICAgICAgICAgICA9IEFTRl9ERUZfSEJfSU5UX01BWDsKCQlwQUMtPkFzZkRhdGEuTWliLkVuYSAgICAgICAgICAgICAgICA9IEFTRl9ERUZfQVNGX0VOQTsKCQlwQUMtPkFzZkRhdGEuTWliLlJzcEVuYWJsZSAgICAgICAgICA9IDA7CgkJcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zICAgICAgICAgICAgPSBBU0ZfREVGX1JFVFJBTlM7CgkJcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ICAgICAgICAgPSBBU0ZfREVGX1JFVFJBTlNfSU5UOwoJCXBBQy0+QXNmRGF0YS5NaWIuSGJFbmEgICAgICAgICAgICAgID0gQVNGX0RFRl9IQl9FTkE7CgkJcEFDLT5Bc2ZEYXRhLk1pYi5IYkludCAgICAgICAgICAgICAgPSBBU0ZfREVGX0hCX0lOVDsKCQlwQUMtPkFzZkRhdGEuTWliLldkRW5hICAgICAgICAgICAgICA9IEFTRl9ERUZfV0FUQ0hET0dfRU5BOwoJCXBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lICAgICAgICAgICAgID0gQVNGX0RFRl9XQVRDSERPR19USU1FOwoJCXBBQy0+QXNmRGF0YS5NaWIuQ29tbXVuaXR5TmFtZVswXSAgID0gMHgwMDsKCQlwQUMtPkFzZkRhdGEuTWliLlJsbXRNb2RlICAgICAgICAgICA9IDB4ZmY7ICAgICAvLyBvbmx5IGZvciBJUE1JIG9wIG1vZGUKCQlwQUMtPkFzZkRhdGEuTWliLlBhdHRVcFJlcSAgICAgICAgICA9IDA7ICAgICAgICAvLyB1cGRhdGUgcGF0dGVybiByZXF1ZXN0IGZsYWcKCgkJLyogU3RhcnQgQVNGIHRpbWVyICovCgkJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CgkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Bc2ZEYXRhLkFzZlRpbWVyLAoJCQkJCSAgNTAwMDAwMCwgU0tHRV9BU0YsIFNLX0FTRl9FVlRfVElNRVJfRVhQSVJFRCwKCQkJCQkgIEV2ZW50UGFyYW0pOwoJCS8vICBpbml0aWFsaXplIHRoZSBGVyBXRCBmdW5jdGlvbmFsaXR5CgkJcEFDLT5Bc2ZEYXRhLkZ3V2RJbnRlcnZhbGwgPSAxMjA7CgkJaWYoIHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX0VYICkgIHsKCQkgIHBBQy0+QXNmRGF0YS5Gd1JhbVNpemUgPSAwOwoJCX0gZWxzZSB7CgogICAJCSAgIGlmKCBSZXRDb2RlID09IFNLX0FTRl9QTk1JX0VSUl9PSyApICB7CgkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogQ2hlY2sgRlcgUmFtc2l6ZVxuIikpOwoJCQlsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9BU0ZfUkFNU0laRSwgMCwgMCwgMSwgQVNGX0hDSV9XQUlULCAyICk7CgoJCQlpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CgkJCS8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCgkJCQlBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CgkJCQlwQUMtPkFzZkRhdGEuRndSYW1TaXplICA9ICgoU0tfVTE2KSoocEhjaVJlY0J1ZisyKSkgPDwgODsKCQkJCXBBQy0+QXNmRGF0YS5Gd1JhbVNpemUgfD0gKChTS19VMTYpKihwSGNpUmVjQnVmKzMpKSA8PCAwOwoKCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogRlcgUmFtU2l6ZTogJWRrQiBcbiIsIHBBQy0+QXNmRGF0YS5Gd1JhbVNpemUpKTsKCQkJfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKCQkJaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKSAgewoJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBlcnJvclxuIikpOwoJCQkJUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMOwoJCQl9CgkJICAgfQoJCX0KCgkJaWYoIFJldENvZGUgPT0gU0tfQVNGX1BOTUlfRVJSX09LICkgIHsKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBBU0YgSW5pdCBPLksuICoqKiAoJWQpXG4iLCBwQUMtPkdJbmkuR0lSYW1TaXplKSk7CgkJCXBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPSBBU0ZfSU5JVF9PSzsKCQkJcEFDLT5HSW5pLkdJUmFtU2l6ZSAtPSBwQUMtPkFzZkRhdGEuRndSYW1TaXplOyAgLy8gIHNob3J0ZW4gUkFNIGJ1ZmZlciBieSBGd1JhbVNpemUKCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBOZXcgUkFNIHZhbHVlICglZGspXG4iLCBwQUMtPkdJbmkuR0lSYW1TaXplKSk7CgojaWZkZWYgQ0hJUF9JRF9ZVUtPTl9FWAkJCQkKCQkgIHN3aXRjaChwQUMtPkFzZkRhdGEuT3BNb2RlKSAgewoJCSAgY2FzZSBTS19HRUFTRl9NT0RFX0RBU0g6CgkJICAgIHBBQy0+R0luaS5HSU51bU9mUGF0dGVybiAtPSA2OwoJCSAgICBicmVhazsKCQkgIGRlZmF1bHQ6CgkJICAgIHBBQy0+R0luaS5HSU51bU9mUGF0dGVybiAtPSAzOwoJCSAgICBicmVhazsKCQkgIH0KCQkgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfSU5JVCwoIiAgICAqKiogTmV3ICMgb2YgcGF0dGVybiAoJWQpXG4iLCBwQUMtPkdJbmkuR0lOdW1PZlBhdHRlcm4pKTsKI2VuZGlmIC8vIENISVBfSURfWVVLT05fRVgJCgkJCQoJCX0gZWxzZSAgewoJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEFTRiBJbml0IGZhaWxlZCAqKipcbiIpKTsKCgkJCUFzZlNtYXJ0UmVzZXRDcHUoIHBBQywgSW9DLCBBU0ZfUkVTRVRfSE9UICk7CgkJCXBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPSBBU0ZfSU5JVF9FUlJPUjsgIC8vICBkaXNhYmxlIEFTRiBmdW5jdGlvbmFsaXR5CgkJCS8vIGFmdGVyIHJlc2V0IHRoZSBjcHUgY2xlYW4gdXAgc29tZSBpbXBvcnRhbnQgcmVnaXN0ZXJzCgkJCUFzZlNldFNNQnVzUmVnaXN0ZXIoSW9DKTsKCQl9CgoJCS8qIGZldGNoIHRoZSBob21lIE1BQyBhZGRyZXNzIGZyb20gYWRhcHRlciAqLwoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKCQkJU0tfSU44KElvQywgKEIyX01BQ18xICsgaSksICZwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVtpXSApOwoJCX0KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKCQlwcmludGsoInNrOThsaW46IFVzaW5nIElQICV1LiV1LiV1LiV1IGZvciBEQVNIIEZXXG4iLCAodW5zaWduZWQgaW50KXBBQy0+SXBBZGRyWzBdLCAodW5zaWduZWQgaW50KXBBQy0+SXBBZGRyWzFdLCAodW5zaWduZWQgaW50KXBBQy0+SXBBZGRyWzJdLCAodW5zaWduZWQgaW50KXBBQy0+SXBBZGRyWzNdKTsKI2VuZGlmCgkJCQojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCQoJCS8qIFdyaXRlIHBhdHRlcm5zIHRvIHBhdHRlcm4gUkFNIG9uIHRoZSBZdWtvbiBib2FyZCovCgkJQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAwKTsKI2VuZGlmCgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJLyogIFNldCBPUyBQcmVzZW50IEZsYWcgaW4gQVNGIFN0YXR1cyBhbmQgQ29tbWFuZCBSZWdpc3RlciAqLwoJCUFzZlNldE9zUHJlc2VudEJpdCggcEFDLCBJb0MgKTsKCgkJLyogIERpc2FibGUgQVJQIHBhdHRlcm4sIGhvc3Qgc3lzdGVtIHRha2VzIG92ZXIgdGhlIEFSUCBoYW5kbGluZyAqLwoJCVlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fQVJQICk7ICAvLyAgRGlzYWJsZSBBUlAgcGF0dGVybiwgT1MgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX0lDTVApOyAgLy8gIERpc2FibGUgSUNNUCBwYXR0ZXJuLCBPUyBpcyBub3cgcmVzcG9uc2libGUgZm9yIElDTVAgaGFuZGxpbmcKCQlZbGNpRGlzYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1NOTVApOyAgLy8gIERpc2FibGUgU05NUCBwYXR0ZXJuLCBPUyBpcyBub3cgcmVzcG9uc2libGUgZm9yIFNOTVAgaGFuZGxpbmcKI2VuZGlmCgojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCgkJaWYoIEFzZkhjaVNlbmRDb21tYW5kKCBwQUMsIElvQywgWUFTRl9IT1NUQ01EX0RSVl9IRUxMTywgMCwgMCwgMCwgQVNGX0hDSV9XQUlULCAzICkgIT0gSENJX0VOX0NNRF9SRUFEWSApICB7CgkJICBwcmludGsoInNrOThsaW46IENvbW11bmljYXRpb24gRHJpdmVyIDwtPiBGVyBpcyBmYWlsaW5nXG4iKTsKCQl9IGVsc2UgewoJCSAgcHJpbnRrKCJzazk4bGluOiBDb21tdW5pY2F0aW9uIERyaXZlciA8LT4gRlcgaXMgd29ya2luZyBwcm9wZXJseVxuIik7CgkJfQojZW5kaWYKCgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlicmVhazsgLyogTm90aGluZyB0b2RvICovCgl9CgoJcmV0dXJuKCBSZXRDb2RlICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmU2V0U01CdXNSZWdpc3RlciAtIGNsZWFuaW5nIHVwIHJlZ2lzdGVyIGZvciBTTUJ1cwoqCiogRGVzY3JpcHRpb246ICBJZiB0aGUgQVNGIEZXIGdvZXMgaW50byBzbWFydCByZXNldCwgdGhpcyBmdW5jdGlvbiBpcwoqICAgICAgICAgICAgICAgY2xlYW5pbmcgdXAgdGhlIFNNQnVzIHJlZ2lzdGVyLgoqCiogUmV0dXJuczoKKi8KCnZvaWQgQXNmU2V0U01CdXNSZWdpc3RlcigKICAgIFNLX0lPQyBJb0MpICAgIC8qIElPIGNvbnRleHQgaGFuZGxlICovCnsKCiAgICBTS19VMzIgVG1wVmFsMzI7CiAgICBTS19VMzIgbWFzazsKCiAgICAvLyBnZXQgcmVnaXN0ZXIKICAgIFNLX0lOMzIoSW9DLCBSRUdfQVNGX1NNQlVTX0NGRywgJlRtcFZhbDMyKTsKCiAgICAvLyBkZWxldGUgYml0IDQ6IFNNQkNfSUUKICAgIC8vIGRlbGV0ZSBiaXQgNTogU01CQ19FQQogICAgLy8gZGVsZXRlIGJpdCA2OiBTTUJDX0dDRQogICAgLy8gZGVsZXRlIGJpdCA3OiBTTUJDX0RBRQogICAgLy8gZGVsZXRlIGJpdCA4OiBTTUJDX1NBRQoKICAgIG1hc2sgICAgICA9IDB4MDAwMDAxZjA7CiAgICBUbXBWYWwzMiAmPSAofm1hc2spOwoKICAgIC8vIHNldCByZWdpc3RlcgogICAgU0tfT1VUMzIoSW9DLCBSRUdfQVNGX1NNQlVTX0NGRywgVG1wVmFsMzIpOwoKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAqKiogQVNGIGNsZWFuaW5nIHVwIFNNQnVzUmVnaXN0ZXIgMHgleCB3aXRoIDB4JXggKioqXG4iLCBSRUdfQVNGX1NNQlVTX0NGRywgVG1wVmFsMzIpKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZEZUluaXQgLSBEZUluaXQgZnVuY3Rpb24gb2YgQVNGCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwppbnQgU2tBc2ZEZUluaXQoClNLX0FDICpwQUMsICAgICAgICAgLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KU0tfSU9DIElvQyApICB7ICAgICAvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwojaWZuZGVmIFVTRV9BU0ZfREFTSF9GVwpTS19VMzIgIFRtcFZhbDMyOwojZW5kaWYKCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKICAgIC8qICBSZXNldCBPUyBQcmVzZW50IEZsYWcgaW4gQVNGIFN0YXR1cyBhbmQgQ29tbWFuZCBSZWdpc3RlciAqLwogICAgQXNmUmVzZXRPc1ByZXNlbnRCaXQoIHBBQywgSW9DICk7CiNlbHNlCiAgICAvKiAgUmVzZXQgT1MgUHJlc2VudCBGbGFnIGluIEFTRiBTdGF0dXMgYW5kIENvbW1hbmQgUmVnaXN0ZXIgKi8KICAgIFNLX0lOMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCAmVG1wVmFsMzIgKTsKICAgIFRtcFZhbDMyICY9IH5CSVRfNDsKICAgIFNLX09VVDMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgVG1wVmFsMzIgKTsKI2VuZGlmCgogICAgaWYoIHBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPT0gQVNGX0lOSVRfT0sgKSAgewojaWZkZWYgVVNFX0FTRl9EQVNIX0ZXCiAgICAgIHN3aXRjaChwQUMtPkFzZkRhdGEuT3BNb2RlKSAgewogICAgICBjYXNlIFNLX0dFQVNGX01PREVfQVNGOgoJLy8gIEVuYWJsZSBBUlAgcGF0dGVybiwgQVNGIEZXIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgQVJQIGhhbmRsaW5nCglZbGNpRW5hYmxlUGF0dGVybiAoIHBBQywgSW9DLCAwLCBBU0ZfUEFUVEVSTl9JRF9BUlAgKTsKCWJyZWFrOwogICAgICBjYXNlIFNLX0dFQVNGX01PREVfSVBNSToKCS8vICBFbmFibGUgQVJQIHBhdHRlcm4sIEFTRiBGVyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZwoJWWxjaUVuYWJsZVBhdHRlcm4gKCBwQUMsIElvQywgMCwgQVNGX1BBVFRFUk5fSURfQVJQICk7CgkKCWlmIChwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPT0gU0tfR0VBU0ZfWTJfRFVBTFBPUlQpIHsKCSAgWWxjaUVuYWJsZVBhdHRlcm4gKCBwQUMsIElvQywgMSwgQVNGX1BBVFRFUk5fSURfQVJQICk7Cgl9CglicmVhazsKICAgICAgY2FzZSBTS19HRUFTRl9NT0RFX0RBU0g6CgkvLyAgRW5hYmxlIEFSUCBwYXR0ZXJuLCBBU0YgRlcgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCVlsY2lFbmFibGVQYXR0ZXJuKCBwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fQVJQICk7CglZbGNpRW5hYmxlUGF0dGVybiggcEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX0lDTVAgKTsKCVlsY2lFbmFibGVQYXR0ZXJuKCBwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fU05NUCApOwkJCglicmVhazsKICAgICAgfSAgLy8gIHN3aXRjaChwQUMtPkFzZkRhdGEuT3BNb2RlKSAKICAgICAgCiAgICAgIC8vICBJbmZvcm0gdGhlIEZXIHRoYXQgdGhlIGRyaXZlciB3aWxsIGJlIHVubG9hZGVkCiAgICAgIEFzZkhjaVNlbmRDb21tYW5kKCBwQUMgLElvQyAsIFlBU0ZfSE9TVENNRF9EUlZfR09PREJZRSwgMCwgMCwgMCwgQVNGX0hDSV9XQUlULCAyICk7CiAgICAgIAogICAgICAvLyAgd2lsbCBiZSBkb25lIGluIEZXIG5vdwkJCiAgICAgIC8vIGlmKCBwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCApCiAgICAgIC8vIEFzZkVuYWJsZUZsdXNoRmlmbyggcEFDLCBJb0MgKTsKI2Vsc2UKICAgICAgaWYgKHBBQy0+QXNmRGF0YS5PcE1vZGUgPT0gU0tfR0VBU0ZfTU9ERV9BU0YpIHsKCS8vICBFbmFibGUgQVJQIHBhdHRlcm4sIEFTRiBGVyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZwoJWWxjaUVuYWJsZVBhdHRlcm4gKCBwQUMsIElvQywgMCwgNSApOwogICAgICB9CiAgICAgIAogICAgICBpZiAocEFDLT5Bc2ZEYXRhLk9wTW9kZSA9PSBTS19HRUFTRl9NT0RFX0lQTUkpIHsKCS8vICBFbmFibGUgQVJQIHBhdHRlcm4sIEFTRiBGVyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZwoJWWxjaUVuYWJsZVBhdHRlcm4gKCBwQUMsIElvQywgMCwgNSApOwoJCglpZiAocEFDLT5Bc2ZEYXRhLkR1YWxNb2RlID09IFNLX0dFQVNGX1kyX0RVQUxQT1JUKSB7CgkgIFlsY2lFbmFibGVQYXR0ZXJuICggcEFDLCBJb0MsIDEsIDUgKTsKCX0KICAgICAgfQogICAgICAKICAgICAgLy8gIEluZm9ybSB0aGUgRlcgdGhhdCB0aGUgZHJpdmVyIHdpbGwgYmUgdW5sb2FkZWQKICAgICAgQXNmSGNpU2VuZENvbW1hbmQoIHBBQywgSW9DLCBZQVNGX0hPU1RDTURfRFJWX0dPT0RCWUUsIDAsIDAsIDAsIEFTRl9IQ0lfV0FJVCwgMiApOwojZW5kaWYKICAgIH0KCiAgICByZXR1cm4oIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTa0FzZkRlSW5pdFN0YW5kQnkgLSBTdGFuZEJ5IC1EZUluaXQgZnVuY3Rpb24gb2YgQVNGCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwppbnQgU2tBc2ZEZUluaXRTdGFuZEJ5KApTS19BQyAqcEFDLCAgICAgICAgIC8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovClNLX0lPQyBJb0MgKSAgeyAgICAgLyogSU8gY29udGV4dCBoYW5kbGUgKi8KCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKICAgIGlmKCBwQUMtPkFzZkRhdGEuSW5pdFN0YXRlID09IEFTRl9JTklUX09LICkgIHsJCiAgICAgIC8vICB3aWxsIGJlIGRvbmUgaW4gRlcgbm93CiAgICAgIGlmKCBwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCApCglBc2ZFbmFibGVGbHVzaEZpZm8oIHBBQywgSW9DICk7CiAgICAgIAogICAgICBzd2l0Y2gocEFDLT5Bc2ZEYXRhLk9wTW9kZSkgIHsKICAgICAgY2FzZSBTS19HRUFTRl9NT0RFX0FTRjoKICAgICAgY2FzZSBTS19HRUFTRl9NT0RFX0lQTUk6CgkvLyAgRW5hYmxlIEFSUCBwYXR0ZXJuLCBBU0YgRlcgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKCVlsY2lFbmFibGVQYXR0ZXJuICggcEFDLCBJb0MsIHBBQy0+QXNmRGF0YS5BY3RpdmVQb3J0LCBBU0ZfUEFUVEVSTl9JRF9BUlAgKTsKCWJyZWFrOwogICAgICBjYXNlIFNLX0dFQVNGX01PREVfREFTSDoKCS8vICBFbmFibGUgQVJQIHBhdHRlcm4sIEFTRiBGVyBpcyBub3cgcmVzcG9uc2libGUgZm9yIEFSUCBoYW5kbGluZwoJWWxjaUVuYWJsZVBhdHRlcm4oIHBBQywgSW9DLCAwLCBBU0ZfREFTSF9QQVRURVJOX05VTV9BUlAgKTsKCVlsY2lFbmFibGVQYXR0ZXJuKCBwQUMsIElvQywgMCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fSUNNUCApOwkJCglZbGNpRW5hYmxlUGF0dGVybiggcEFDLCBJb0MsIDAsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1NOTVAgKTsKCWJyZWFrOwogICAgICB9ICAvLyAgc3dpdGNoKHBBQy0+QXNmRGF0YS5PcE1vZGUpIAogICAgICAKICAgICAgLy8gIEluZm9ybSB0aGUgRlcgdGhhdCB0aGUgZHJpdmVyIHdpbGwgYmUgdW5sb2FkZWQKICAgICAgQXNmSGNpU2VuZENvbW1hbmQoIHBBQyAsSW9DICwgWUFTRl9IT1NUQ01EX0RSVl9TVEFOREJZLCAwLCAwLCAwLCBBU0ZfSENJX1dBSVQsIDIgKTsKICAgIH0KI2Vsc2UKICAgIGlmKCBwQUMtPkFzZkRhdGEuSW5pdFN0YXRlID09IEFTRl9JTklUX09LICkgIHsKICAgICAgICAvLyAgRW5hYmxlIEFSUCBwYXR0ZXJuLCBBU0YgRlcgaXMgbm93IHJlc3BvbnNpYmxlIGZvciBBUlAgaGFuZGxpbmcKICAgICAgICBZbGNpRW5hYmxlUGF0dGVybiAoIHBBQywgSW9DLCBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgNSApOwogICAgICAgIC8vICBJbmZvcm0gdGhlIEZXIHRoYXQgdGhlIGRyaXZlciB3aWxsIGJlIHVubG9hZGVkCiAgICAgICAgQXNmSGNpU2VuZENvbW1hbmQoIHBBQywgSW9DLCBZQVNGX0hPU1RDTURfRFJWX1NUQU5EQlksIDAsIDAsIDAsIEFTRl9IQ0lfV0FJVCwgMiApOwogICAgfQojZW5kaWYKCiAgICByZXR1cm4oIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTa0FzZkluaXRTdGFuZEJ5IC0gU3RhbmRCeSAtIEluaXQgZnVuY3Rpb24gb2YgQVNGCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwppbnQgU2tBc2ZJbml0U3RhbmRCeSgKU0tfQUMgICAqcEFDLCAgICAgICAvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLwpTS19JT0MgIElvQywgICAgICAgIC8qIElPIGNvbnRleHQgaGFuZGxlICovCmludCAgICAgTGV2ZWwpIHsgICAgLyogSW5pdGlhbGl6YXRpb24gbGV2ZWwgKi8KI2lmbmRlZiBVU0VfQVNGX0RBU0hfRlcKICAgIFNLX1UzMiAgICAgICAgICBUbXBWYWwzMjsKI2VuZGlmCiAgICBTS19FVlBBUkEgICAgICAgRXZlbnRQYXJhbTsgLyogRXZlbnQgc3RydWN0IGZvciB0aW1lciBldmVudCAqLwoJCiNpZmRlZiBVU0VfQVNGX0RBU0hfRlcKICAgIGlmKCBwQUMtPkFzZkRhdGEuSW5pdFN0YXRlID09IEFTRl9JTklUX09LICkgIHsKICAgICAgICBzd2l0Y2goTGV2ZWwpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIFNLX0lOSVRfREFUQToKICAgICAgICAgICAgICAgIC8qICBTZXQgT1MgUHJlc2VudCBGbGFnIGluIEFTRiBTdGF0dXMgYW5kIENvbW1hbmQgUmVnaXN0ZXIgKi8KCSAgICAgICAgQXNmU2V0T3NQcmVzZW50Qml0KCBwQUMsIElvQyApOwoKICAgICAgICAgICAgICAgIC8vICBEaXNhYmxlIEFSUCBwYXR0ZXJuLCBob3N0IHN5c3RlbSB0YWtlcyBvdmVyIHRoZSBBUlAgaGFuZGxpbmcKICAgICAgICAgICAgICAgIFlsY2lEaXNhYmxlUGF0dGVybiggcEFDLCBJb0MscEFDLT5Bc2ZEYXRhLkFjdGl2ZVBvcnQsIEFTRl9QQVRURVJOX0lEX0FSUCk7CiAgICAgICAgICAgICAgICAvLyAgSW5mb3JtIHRoZSBGVyB0aGF0IHRoZSBkcml2ZXIgd2lsbCBiZSBhY3RpdmF0ZWQgYWdhaW4KICAgICAgICAgICAgICAgIEFzZkhjaVNlbmRDb21tYW5kKCBwQUMgLElvQyAsIFlBU0ZfSE9TVENNRF9EUlZfSEVMTE8sIDAsIDAsIDAsIEFTRl9IQ0lfV0FJVCwgMiApOwoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBTS19JTklUX0lPOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFNLX0lOSVRfUlVOOgogICAgICAgICAgICAgICAgU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CiAgICAgICAgICAgICAgICBTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkFzZkRhdGEuQXNmVGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwMDAwLCBTS0dFX0FTRiwgU0tfQVNGX0VWVF9USU1FUl9FWFBJUkVELCAgRXZlbnRQYXJhbSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9ICAvLyAgc3dpdGNoKCBMZXZlbCApCiAgICB9ICAvLyAgaWYoIHBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPT0gQVNGX0lOSVRfT0sgCiNlbHNlCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkluaXRTdGF0ZSA9PSBBU0ZfSU5JVF9PSyApICB7CiAgICAgICAgc3dpdGNoKExldmVsKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSBTS19JTklUX0RBVEE6CiAgICAgICAgICAgICAgICAvKiAgU2V0IE9TIFByZXNlbnQgRmxhZyBpbiBBU0YgU3RhdHVzIGFuZCBDb21tYW5kIFJlZ2lzdGVyICovCiAgICAgICAgICAgICAgICBTS19JTjMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgJlRtcFZhbDMyICk7CiAgICAgICAgICAgICAgICBUbXBWYWwzMiB8PSBCSVRfNDsKICAgICAgICAgICAgICAgIC8vICBEaXNhYmxlIEFSUCBwYXR0ZXJuLCBob3N0IHN5c3RlbSB0YWtlcyBvdmVyIHRoZSBBUlAgaGFuZGxpbmcKICAgICAgICAgICAgICAgIFlsY2lEaXNhYmxlUGF0dGVybiAoIHBBQywgSW9DLCBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgNSApOwoKICAgICAgICAgICAgICAgIC8vIEluZm9ybSB0aGUgRlcgdGhhdCB0aGUgZHJpdmVyIHdpbGwgYmUgYWN0aXZhdGVkIGFnYWluCgkJLy8gU2NobGVjaHRlIElkZWUsIHNjaGFsdGV0IEFTRiBiZWltIGxhZGVuIGRlcyBUcmVpYmVycyBhYgogICAgICAgICAgICAgICAgLy8gQXNmSGNpU2VuZENvbW1hbmQoIHBBQywgSW9DLCBZQVNGX0hPU1RDTURfRFJWX0hFTExPLCAwLCAwLCAwLCBBU0ZfSENJX1dBSVQsIDIgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBTS19JTklUX0lPOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFNLX0lOSVRfUlVOOgogICAgICAgICAgICAgICAgU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CiAgICAgICAgICAgICAgICBTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkFzZkRhdGEuQXNmVGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwMDAwLCBTS0dFX0FTRiwgU0tfQVNGX0VWVF9USU1FUl9FWFBJUkVELCAgRXZlbnRQYXJhbSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9ICAvLyAgc3dpdGNoKCBMZXZlbCApCiAgICB9ICAvLyAgaWYoIHBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPT0gQVNGX0lOSVRfT0sgKQojZW5kaWYKICAgIHJldHVybiggMCApOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICAgU2tBc2ZTZXByb20yTWliICAgICByZWFkcyBBU0YgTUlCIGNvbmZpZyBkYXRhIGZyb20gU0VQUk9NCioKKiAgIENvbnRleHQ6CioKKgoqICAgUmV0dXJuczogICAgMDogIHN1Y2Nlc3NmdWwKKiAgICAgICAgICAgICAgIDE6ICBlcnJvcgoqLwoKU0tfSTggU2tBc2ZTZXByb20yTWliKApTS19BQyAqcEFDLCAgICAgIC8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovClNLX0lPQyBJb0MgKSB7ICAgLyogSU8gY29udGV4dCBoYW5kbGUgKi8KCiAgICBTS19VOCAgIGluZDsKICAgIFNLX1U4ICAgaTsKICAgIFNLX1U4ICAgdmVyc2lvbjsKICAgIFNLX0k4ICAgUmV0Q29kZTsKICAgIFNLX1UzMiAgb3VyX3JlZzI7CiAgICBTS19VMzIgIExlbjsKCiAgICBpbmQgPSAwOwoKICAgIFZQRF9JTjMyKHBBQywgSW9DLCBQQ0lfT1VSX1JFR18yLCAmb3VyX3JlZzIpOwogICAgcEFDLT52cGQucm9tX3NpemUgPSAyNTYgPDwgKChvdXJfcmVnMiAmIFBDSV9WUERfUk9NX1NaKSA+PiAxNCk7CgogICAgTGVuID0gVnBkUmVhZEJsb2NrKCBwQUMsIElvQywgJnBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbMF0sIEFTRl9WUERfQ09ORklHX0JBU0UsIEFTRl9WUERfQ09ORklHX1NJWkUgKTsKICAgIGlmKCBMZW4gPT0gQVNGX1ZQRF9DT05GSUdfU0laRSApICB7CiAgICAgICAgUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9PSzsKICAgICAgICAvKiBjaGVjaywgd2hldGhlciB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkICovCiAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbMF0gPT0gJ0EnICYmCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbMV0gPT0gJ1MnICYmCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbMl0gPT0gJ0YnICYmCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbM10gPT0gJyEnICkgewogICAgICAgICAgICBpbmQgPSA0OwogICAgICAgICAgICB2ZXJzaW9uID0gcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgIHN3aXRjaCggdmVyc2lvbiApICB7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5FbmEgPSAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJzcEVuYWJsZSA9ICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFucyA9ICAgICAgKFNLX1UxNikgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFucyB8PSAgICAgKFNLX1UxNikgKHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCA9ICAgKFNLX1UzMikgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCB8PSAgKFNLX1UzMikgKHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCB8PSAgKFNLX1UzMikgKHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdIDw8IDE2KTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnQgfD0gIChTS19VMzIpIChwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA8PCAyNCk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkVuYSA9ICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50ID0gICAgICAgIChTS19VMzIpICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50IHw9ICAgICAgIChTS19VMzIpIChwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50IHw9ICAgICAgIChTS19VMzIpIChwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA8PCAxNik7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkludCB8PSAgICAgICAoU0tfVTMyKSAocEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPDwgMjQpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmEgPSAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgPSAgICAgICAoU0tfVTMyKSAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgfD0gICAgICAoU0tfVTMyKSAocEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgfD0gICAgICAoU0tfVTMyKSAocEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPDwgMTYpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lIHw9ICAgICAgKFNLX1UzMikgKHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdIDw8IDI0KTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFtpXSA9ICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlW2ldID0gICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbaV0gPSAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw2NDsgaSsrICkKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldID0gcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXNlcnZlZFtpXSA9ICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICBPLksuXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuRW5hID0gICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Sc3BFbmFibGUgPSAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnMgPSAgICAgIChTS19VMTYpICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCA9ICAgKFNLX1UzMikgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gKiAxMDsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiRW5hID0gICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnQgPSAgICAgICAgKFNLX1UzMikgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gKiAxMDsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLldkRW5hID0gICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lID0gICAgICAgKFNLX1UzMikgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gKiAxMDsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFtpXSA9ICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlW2ldID0gICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbaV0gPSAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTwxMDsgaSsrICkKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldID0gcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXNlcnZlZFtpXSA9ICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK107CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICBPLksuXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlIEFTRiBzaWduYXR1cmUsIHRoaXMgY2F1c2VzIGEgbmV3IGZvcm1hdGluZyBvZiB0aGUgU0VFUFJPTQogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbMF0gPSAneCc7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZlsxXSA9ICd4JzsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmWzJdID0gJ3gnOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbM10gPSAneCc7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICB1bmtub3duIHZlcnNpb246IDB4JXhcbiIsIHZlcnNpb24gKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gIC8vICBzd2l0Y2goIHZlcnNpb24gKSAgewogICAgICAgIH0KICAgICAgICBlbHNlICB7CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgKioqIEVycm9yOiBTaWduYXR1cmUgbm90IHZhbGlkXG4iKSk7CiAgICAgICAgfQogICAgfSAgLy8gIGlmKCBMZW4gPT0gLi4gICkKICAgIGVsc2UgIHsKICAgICAgICBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX0dFTkVSQUw7CiAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAqKiogZmFpbGVkXG4iKSk7CiAgICB9CgogICAgcmV0dXJuKCBSZXRDb2RlICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICAgU2tBc2ZNaWIyU2Vwcm9tICAgICB3cml0ZXMgQVNGIE1JQiBjb25maWcgZGF0YSB0byBTRVBST00KKgoqICAgQ29udGV4dDoKKgoqCiogICBSZXR1cm5zOiAgICAwOiAgc3VjY2Vzc2Z1bAoqICAgICAgICAgICAgICAgMTogIGVycm9yCiovCgpTS19JOCBTa0FzZk1pYjJTZXByb20oClNLX0FDICpwQUMsICAgICAgLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KU0tfSU9DIElvQyApIHsgICAvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwoKICAgIFNLX1U4ICAgaW5kOwogICAgU0tfVTggICBpOwogICAgU0tfSTggICBSZXRDb2RlOwogICAgU0tfVTMyICBvdXJfcmVnMjsKICAgIFNLX1UzMiAgTGVuOwogICAgU0tfVTggICB2ZXJzaW9uOwoKICAgIHZlcnNpb24gPSAyOwoKICAgIGluZCA9IDA7CiAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9ICdBJzsKICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gJ1MnOwogICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAnRic7CiAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9ICchJzsKICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gdmVyc2lvbjsKICAgIHN3aXRjaCggdmVyc2lvbiApICB7CiAgICAgICAgY2FzZSAxOiAgLy8gIDEwMSBCeXRlcwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuRW5hOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9IChTS19VOCkgKHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFucyA+PiAwKSAmIDB4MDBmZjsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLlJldHJhbnMgPj4gOCkgJiAweDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID4+IDApICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID4+IDgpICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID4+IDE2KSAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID4+IDI0KSAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5IYkVuYTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLkhiSW50ID4+IDApICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5IYkludCA+PiA4KSAgJiAweDAwMDAwMGZmOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9IChTS19VOCkgKHBBQy0+QXNmRGF0YS5NaWIuSGJJbnQgPj4gMTYpICYgMHgwMDAwMDBmZjsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLkhiSW50ID4+IDI0KSAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5XZEVuYTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLldkVGltZSA+PiAwKSAgJiAweDAwMDAwMGZmOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuVnBkQ29uZmlnQnVmW2luZCsrXSA9IChTS19VOCkgKHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lID4+IDgpICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgPj4gMTYpICYgMHgwMDAwMDBmZjsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLldkVGltZSA+PiAyNCkgJiAweDAwMDAwMGZmOwogICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFtpXTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVtpXTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0W2ldOwogICAgICAgICAgICBmb3IoIGk9MDsgaTw2NDsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldOwogICAgICAgICAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLlJlc2VydmVkW2ldOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAyOiAgLy8gIDQwIEJ5dGVzCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5FbmE7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5Sc3BFbmFibGU7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnMgJiAweDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gKFNLX1U4KSAocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50IC8gMTApICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5IYkVuYTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLkhiSW50IC8gMTApICAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5XZEVuYTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSAoU0tfVTgpIChwQUMtPkFzZkRhdGEuTWliLldkVGltZSAvIDEwKSAgJiAweDAwMDAwMGZmOwogICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFtpXTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVtpXTsKICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0W2ldOwogICAgICAgICAgICBmb3IoIGk9MDsgaTwxMDsgaSsrICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRDb25maWdCdWZbaW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldOwogICAgICAgICAgICBmb3IoIGk9MDsgaTw2OyBpKysgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZltpbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLlJlc2VydmVkW2ldOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICB9ICAvLyAgc3dpdGNoKCB2ZXJzaW9uICkgIHsKCgoKICAgIFZQRF9JTjMyKHBBQywgSW9DLCBQQ0lfT1VSX1JFR18yLCAmb3VyX3JlZzIpOwogICAgcEFDLT52cGQucm9tX3NpemUgPSAyNTYgPDwgKChvdXJfcmVnMiAmIFBDSV9WUERfUk9NX1NaKSA+PiAxNCk7CgogICAgLy8gZW5hYmxlIENvbmZpZyB3cml0ZSBSZWcgMHgxNTgKICAgIC8vIFNLX0lOOCggSW9DLCBCMl9UU1RfUkVHMSwgJlRtcFZhbDggKQogICAgLy8gVG1wVmFsOCAmPSB+MHgwMzsKICAgIC8vIFRtcFZhbDggfD0gMHgwMjsKICAgIC8vIFNLX09VVDgoIElvQywgQjJfVFNUX1JFRzEsIFRtcFZhbDggKQogICAgU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CgogICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZNaWIyU2Vwcm9tIFxuIikpOwogICAgTGVuID0gVnBkV3JpdGVCbG9jayhwQUMsSW9DLCAmcEFDLT5Bc2ZEYXRhLlZwZENvbmZpZ0J1ZlswXSwgQVNGX1ZQRF9DT05GSUdfQkFTRSwgQVNGX1ZQRF9DT05GSUdfU0laRSApOwogICAgaWYoIExlbiA9PSBBU0ZfVlBEX0NPTkZJR19TSVpFICkgIHsKICAgICAgICBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX09LOwogICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPLksuIFxuIikpOwogICAgfQogICAgZWxzZSAgewogICAgICAgIFJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTDsKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIGZhaWxlZCBcbiIpKTsKICAgIH0KCiAgICAvLyBkaXNhYmxlIENvbmZpZyB3cml0ZSBSZWcgMHgxNTgKICAgIC8vIFNLX0lOOCggSW9DLCBCMl9UU1RfUkVHMSwgJlRtcFZhbDggKQogICAgLy8gVG1wVmFsOCAmPSB+MHgwMzsKICAgIC8vIFRtcFZhbDggfD0gMHgwMTsKICAgIC8vIFNLX09VVDgoIElvQywgQjJfVFNUX1JFRzEsIFRtcFZhbDggKQogICAgU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwoKICAgIHJldHVybiggUmV0Q29kZSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogICBTa0FzZlRyaWdnZXJQZXRGcmFtZXMKKgoqICAgQ29udGV4dDoKKiAgIGluaXQsIHBhZ2VhYmxlCioKKiAgIFJldHVybnM6IHZvaWQKKi8KCnZvaWQgU2tBc2ZUcmlnZ2VyUGV0RnJhbWVzIChTS19JT0MgSW9DLCBTS19VMzIgKlRtcFZhbDMyKQp7CgogICAgcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIFNrQXNmUHJlU2V0T2lkIC0KKgoqIENvbnRleHQ6CiogICBpbml0LCBwYWdlYWJsZQoqCiogUmV0dXJuczoKKi8KaW50IFNrQXNmUHJlU2V0T2lkKAogICAgICAgICAgICBTS19BQyAqcEFDLCAvKiB0aGUgYWRhcHRlciBjb250ZXh0ICovCiAgICAgICAgICAgIFNLX0lPQyBJb0MsIC8qIEkvTyBjb250ZXh0ICovCiAgICAgICAgICAgIFNLX1UzMiBJZCwgIC8qIE9JRCAgKi8KICAgICAgICAgICAgU0tfVTMyIEluc3QsCiAgICAgICAgICAgIFNLX1U4ICpwQnVmLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBMZW4pCnsKICAgIFNLX1UzMiBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX09LOwoKCiAgICBzd2l0Y2goIElkICkgIHsKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9FTkE6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAqcExlbiA9IDA7CiAgICAgICAgICAgIFJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKFJldENvZGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIFNrQXNmU2V0T2lkIC0KKgoqIENvbnRleHQ6CiogICBpbml0LCBwYWdlYWJsZQoqCiogUmV0dXJuczoKKi8KaW50IFNrQXNmU2V0T2lkKAogICAgICAgICAgICBTS19BQyAqcEFDLCAvKiB0aGUgYWRhcHRlciBjb250ZXh0ICovCiAgICAgICAgICAgIFNLX0lPQyBJb0MsIC8qIEkvTyBjb250ZXh0ICovCiAgICAgICAgICAgIFNLX1UzMiBJZCwgIC8qIE9JRCAgKi8KICAgICAgICAgICAgU0tfVTMyIEluc3QsCiAgICAgICAgICAgIFNLX1U4ICpwQnVmLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBMZW4pCnsKICAgIFNLX1UxNiAgICAgICAgICBpOwoKICAgIFNLX1UzMiAgUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9PSzsKCiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlNldE9pZCAtPiBPSUQ6MHgleCBMZW46JWQgKioqKioqKioqKioqKioqKioqKioqKipcbiIsIElkLCAqcExlbiApKTsKCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkluaXRTdGF0ZSAhPSBBU0ZfSU5JVF9PSyApICB7CiAgICAgICAgcmV0dXJuKCBTS19BU0ZfUE5NSV9FUlJfR0VORVJBTCApOwogICAgfQoKICAgIHN3aXRjaCggSWQgKSAgewogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1NUT1JFX0NPTkZJRzoKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5OZXdQYXJhbSA9IDQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9FTkE6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSAxICkgIHsKICAgICAgICAgICAgICAgIGlmKCAqcEJ1ZiAhPSBwQUMtPkFzZkRhdGEuTWliLkVuYSApCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db25maWdDaGFuZ2UgfD0gMHgwMTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuRW5hID0gKnBCdWY7CiAgICAgICAgICAgICAgICAqcExlbiA9IDE7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0VOQTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkVuYSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfUkVUUkFOUzoKICAgICAgICAgICAgaWYoICpwTGVuID09IDIgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zID0gKiggKFNLX1UxNiAqKSBwQnVmICk7CiAgICAgICAgICAgICAgICAqcExlbiA9IDI7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX1JFVFJBTlM6ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0lOVDoKICAgICAgICAgICAgaWYoICpwTGVuID09IDIgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID0gKiggKFNLX1UxNiAqKSBwQnVmICkgKiBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gMjsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUkVUUkFOU19JTlQ6ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9IQl9FTkE6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSAxICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSGJFbmEgPSAqcEJ1ZjsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfSEJfRU5BOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuSGJFbmEgKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0lOVDoKICAgICAgICAgICAgaWYoICpwTGVuID09IDQgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkludCA9ICooIChTS19VMzIgKikgcEJ1ZiApICogQVNGX0dVSV9UU0Y7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0hCX0lOVDogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkhiSW50ICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9XRF9FTkE6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSAxICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmEgPSAqcEJ1ZjsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfV0RfRU5BOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmEgKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1dEX1RJTUU6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSA0ICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lID0gKiggKFNLX1UzMiAqKSBwQnVmICkgKiBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfV0RfVElNRTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLldkVGltZSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfSVBfREVTVDoKICAgICAgICAgICAgaWYoIEFzZkFzY2kySXAoIHBCdWYsICpwTGVuLCBwQUMtPkFzZkRhdGEuTWliLklwRGVzdCApICA9PSAxICkgICB7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0lQX0RFU1Q6ICVkLiVkLiVkLiVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbMF0sIHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbMl0sIHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0WzNdICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfTUFDX0RFU1Q6CiAgICAgICAgICAgIGlmKCBBc2ZBc2NpMk1hYyggcEJ1ZiwgKnBMZW4sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdCApICA9PSAxICkgICB7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX01BQ19ERVNUOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFswXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzJdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbNF0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFs1XSApKTsKI2lmZGVmIEFTRl9GV19BUlBfUkVTT0xWRQogICAgICAgICAgICAgICAgLy8gIGp1c3QgZm9yIEZXLUFSUC1SZXNvbHZlIHRlc3RpbmcgcHVycG9zZXMKLy8gICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKLy8gICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFtpXSA9IDA7CiNlbmRpZiAgLy8gIEFTRl9GV19BUlBfUkVTT0xWRQoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0NPTU1VTklUWV9OQU1FOgogICAgICAgICAgICBmb3IoIGk9MDsgKGk8KnBMZW4pJiYoaTw2Myk7IGkrKyApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkNvbW11bml0eU5hbWVbaV0gPSAqKHBCdWYgKyBpKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldID0gMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1JTUF9FTkE6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSAxICkgIHsKICAgICAgICAgICAgICAgIGlmKCAqcEJ1ZiAhPSBwQUMtPkFzZkRhdGEuTWliLlJzcEVuYWJsZSApCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db25maWdDaGFuZ2UgfD0gMHgwMjsKCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJzcEVuYWJsZSA9ICpwQnVmOwogICAgICAgICAgICAgICAgKnBMZW4gPSAxOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SU1BfRU5BOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0NPVU5UX01JTjoKICAgICAgICAgICAgaWYoICpwTGVuID09IDQgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zQ291bnRNaW4gPSAqKCAoU0tfVTMyICopIHBCdWYgKTsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUkVUUkFOU19DT1VOVF9NSU46ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zQ291bnRNaW4gKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1JFVFJBTlNfQ09VTlRfTUFYOgogICAgICAgICAgICBpZiggKnBMZW4gPT0gNCApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNDb3VudE1heCA9ICooIChTS19VMzIgKikgcEJ1ZiApOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0NPVU5UX01BWDogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNDb3VudE1heCApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfUkVUUkFOU19JTlRfTUlOOgogICAgICAgICAgICBpZiggKnBMZW4gPT0gNCApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnRNaW4gPSAqKCAoU0tfVTMyICopIHBCdWYgKSAqIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0lOVF9NSU46ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50TWluICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0lOVF9NQVg6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSA0ICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludE1heCA9ICooIChTS19VMzIgKikgcEJ1ZiApICogQVNGX0dVSV9UU0Y7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX1JFVFJBTlNfSU5UX01BWDogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnRNYXggKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0lOVF9NSU46CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSA0ICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNaW4gPSAqKCAoU0tfVTMyICopIHBCdWYgKSAqIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9IQl9JTlRfTUlOOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNaW4gKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0lOVF9NQVg6CiAgICAgICAgICAgIGlmKCAqcExlbiA9PSA0ICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNYXggPSAqKCAoU0tfVTMyICopIHBCdWYgKSAqIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9IQl9JTlRfTUFYOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNYXggKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1dEX1RJTUVfTUlOOgogICAgICAgICAgICBpZiggKnBMZW4gPT0gNCApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLldkVGltZU1pbiA9ICooIChTS19VMzIgKikgcEJ1ZiApICogQVNGX0dVSV9UU0Y7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX1dEX1RJTUVfTUlOOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lTWluICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9XRF9USU1FX01BWDoKICAgICAgICAgICAgaWYoICpwTGVuID09IDQgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNYXggPSAqKCAoU0tfVTMyICopIHBCdWYgKSAqIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9XRF9USU1FX01BWDogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLldkVGltZU1heCApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX09QOgogICAgICAgICAgICBpZiggKnBMZW4gPT0gKFJTUF9LRVlMRU5HVEgqMikgKSAgewogICAgICAgICAgICAgICAgQXNmSGV4MkFycmF5KCBwQnVmLCAqcExlbiwgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvciApOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9LRVlfT1A6XG4gPiIpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPFJTUF9LRVlMRU5HVEg7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIscEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvcltpXSApKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIjxcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX0FETToKICAgICAgICAgICAgaWYoICpwTGVuID09IChSU1BfS0VZTEVOR1RIKjIpICkgIHsKICAgICAgICAgICAgICAgIEFzZkhleDJBcnJheSggcEJ1ZiwgKnBMZW4sIHBBQy0+QXNmRGF0YS5NaWIuS2V5QWRtaW5pc3RyYXRvciApOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9LRVlfQURNOlxuID4iKSk7CiAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTxSU1BfS0VZTEVOR1RIOyBpKysgKQogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiUwMngiLHBBQy0+QXNmRGF0YS5NaWIuS2V5QWRtaW5pc3RyYXRvcltpXSApKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIjxcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX0dFTjoKICAgICAgICAgICAgaWYoICpwTGVuID09IChSU1BfS0VZTEVOR1RIKjIpICkgIHsKICAgICAgICAgICAgICAgIEFzZkhleDJBcnJheSggcEJ1ZiwgKnBMZW4sIHBBQy0+QXNmRGF0YS5NaWIuS2V5R2VuZXJhdG9yICk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0tFWV9HRU46XG4gPiIpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPFJTUF9LRVlMRU5HVEg7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIscEFDLT5Bc2ZEYXRhLk1pYi5LZXlHZW5lcmF0b3JbaV0gKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCI8XG4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1BBUl8xOgogICAgICAgICAgICBpZiggKnBMZW4gPT0gMSApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJlc2VydmVkW0lkLU9JRF9TS0dFX0FTRl9QQVJfMV0gPSAqcEJ1ZjsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUEFSX1g6IC0tLVxuIiApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfSVBfU09VUkNFOgogICAgICAgICAgICAqcExlbiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9GV1ZFUl9PSUQ6CiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0FDUElfT0lEOgogICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9TTUJVU19PSUQ6CiAgICAgICAgICAgIC8vIHRoZXNlIE9JRHMgYXJlIHJlYWQgb25seSAtIHRoZXkgY2Fubm90IGJlIHNldAogICAgICAgICAgICAqcExlbiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAqcExlbiA9IDA7CiAgICAgICAgICAgIFJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRDsKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRCBub3Qgc3VwcG9ydGVkIFxuIiApKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYoIFJldENvZGUgIT0gU0tfQVNGX1BOTUlfRVJSX09LICkgIHsgLy8gIE5vIGJ5dGVzIHVzZWQKICAgICAgICBpZiggUmV0Q29kZSA9PSBTS19QTk1JX0VSUl9UT09fU0hPUlQgKSAgewogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEVycm9yIExlbmd0aDogJWQgXG4iLCAqcExlbiApKTsKICAgICAgICB9CiAgICAgICAgZWxzZSAgewogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgKioqIEVycm9yID8/P1xuIiwgKnBMZW4gKSk7CiAgICAgICAgfQogICAgICAgICpwTGVuID0gMDsKICAgIH0KICAgIGVsc2UKICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk5ld1BhcmFtID0gMjsgIC8vICBUcmlnZ2VyIFNFUFJPTSBVcGRhdGUKCgogICAgcmV0dXJuKFJldENvZGUpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogICBTa0FzZkdldE9pZCAtCioKKiBDb250ZXh0OgoqICAgaW5pdCwgcGFnZWFibGUKKgoqIFJldHVybnM6CiovCmludCBTa0FzZkdldE9pZCgKICAgICAgICAgICAgU0tfQUMgKnBBQywgLyogdGhlIGFkYXB0ZXIgY29udGV4dCAqLwogICAgICAgICAgICBTS19JT0MgSW9DLCAvKiBJL08gY29udGV4dCAqLwogICAgICAgICAgICBTS19VMzIgSWQsICAvKiBPSUQgICovCiAgICAgICAgICAgIFNLX1UzMiBJbnN0LAogICAgICAgICAgICBTS19VOCAqcEJ1ZiwKICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwTGVuKQp7CiAgICBTS19VMzIgIFRtcFZhbDMyOwogICAgU0tfVTMyICBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX09LOwogICAgU0tfVTggICBpOwoKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmR2V0T2lkIC0+IE9JRDoweCV4IExlbjolZFxuIiwgSWQsICpwTGVuICkpOwoKICAgIGlmKCBwQUMtPkFzZkRhdGEuSW5pdFN0YXRlICE9IEFTRl9JTklUX09LICkgIHsKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlNldE9pZCAtPiBHZXQgT0lEIGRlbmllZCwgQVNGIG5vdCBpbml0aWFsaXplZCAhXG4iLCBJZCwgKnBMZW4gKSk7CiAgICAgICAgaWYoIElkICE9IE9JRF9TS0dFX0FTRl9DQVAgKQogICAgICAgICAgICByZXR1cm4oIFNLX0FTRl9QTk1JX0VSUl9HRU5FUkFMICk7CiAgICB9CgogICAgc3dpdGNoKCBJZCApICB7CiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfQ0FQOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNCApICB7CiAgICAgICAgICAgICAgICBUbXBWYWwzMiA9IDA7CiAgICAgICAgICAgICAgICBpZiggKHBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgIT0gQVNGX0lOSVRfVU5ERUZJTkVEKSAmJgogICAgICAgICAgICAgICAgICAgIChwQUMtPkFzZkRhdGEuSW5pdFN0YXRlICE9IEFTRl9JTklUX0VSUk9SX0NISVBfSUQpICkKICAgICAgICAgICAgICAgICAgICBUbXBWYWwzMiB8PSBCSVRfMDsgIC8vICBBU0YgY2FwYWJsZQogICAgICAgICAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5Jbml0U3RhdGUgPT0gQVNGX0lOSVRfT0sgKQogICAgICAgICAgICAgICAgICAgIFRtcFZhbDMyIHw9IEJJVF8xOyAgLy8gIEFTRiBJbml0IE9LCiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5FbmEgKQogICAgICAgICAgICAgICAgICAgIFRtcFZhbDMyIHw9IEJJVF8yOyAgLy8gIEFTRiBlbmFibGUKICAgICAgICAgICAgICAgICooIChTS19VMzIgKikgcEJ1ZiApID0gVG1wVmFsMzI7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0VOQTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkVuYSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9FTkE6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSAxICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VOCAqKSBwQnVmICkgPSBwQUMtPkFzZkRhdGEuTWliLkVuYTsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfRU5BOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuRW5hICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1JFVFJBTlM6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSAyICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VMTYgKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zOwogICAgICAgICAgICAgICAgKnBMZW4gPSAyOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SRVRSQU5TOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFucyApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDI7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0lOVDoKICAgICAgICAgICAgaWYoICpwTGVuID49IDQgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1UzMiAqKSBwQnVmICkgPSBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnQgLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUkVUUkFOU19JTlQ6ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0VOQToKICAgICAgICAgICAgaWYoICpwTGVuID49IDEgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1U4ICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuSGJFbmE7CiAgICAgICAgICAgICAgICAqcExlbiA9IDE7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0hCX0VOQTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkhiRW5hICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0lOVDoKICAgICAgICAgICAgaWYoICpwTGVuID49IDQgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1UzMiAqKSBwQnVmICkgPSBwQUMtPkFzZkRhdGEuTWliLkhiSW50IC8gQVNGX0dVSV9UU0Y7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0hCX0lOVDogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkhiSW50ICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1dEX0VOQToKICAgICAgICAgICAgaWYoICpwTGVuID49IDEgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1U4ICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuV2RFbmE7CiAgICAgICAgICAgICAgICAqcExlbiA9IDE7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX1dEX0VOQTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLldkRW5hICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1dEX1RJTUU6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSA0ICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VMzIgKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfV0RfVElNRTogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLldkVGltZSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9JUF9TT1VSQ0U6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSAxNiApICB7CiAgICAgICAgICAgICAgICBBc2ZJcDJBc2NpKCBwQnVmKzEsIHBMZW4sIHBBQy0+QXNmRGF0YS5NaWIuSXBTb3VyY2UgKTsKICAgICAgICAgICAgICAgICpwQnVmID0gKFNLX1U4KSAqcExlbjsKICAgICAgICAgICAgICAgICgqcExlbikrKzsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfSVBfU09VUkNFOiAlZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSXBTb3VyY2VbMF0sIHBBQy0+QXNmRGF0YS5NaWIuSXBTb3VyY2VbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzJdLCBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzNdICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTY7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9JUF9ERVNUOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gMTYgKSAgewogICAgICAgICAgICAgICAgQXNmSXAyQXNjaSggcEJ1ZisxLCBwTGVuLCBwQUMtPkFzZkRhdGEuTWliLklwRGVzdCApOwogICAgICAgICAgICAgICAgKnBCdWYgPSAoU0tfVTgpICpwTGVuOwogICAgICAgICAgICAgICAgKCpwTGVuKSsrOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9JUF9ERVNUOiAlZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0WzBdLCBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0WzJdLCBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFszXSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDE2OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfTUFDX0RFU1Q6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSAxOCApICB7CiAgICAgICAgICAgICAgICBBc2ZNYWMyQXNjaSggcEJ1ZisxLCBwTGVuLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3QgKTsKICAgICAgICAgICAgICAgICpwQnVmID0gKFNLX1U4KSAqcExlbjsKICAgICAgICAgICAgICAgICgqcExlbikrKzsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfTUFDX0RFU1Q6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzBdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMl0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFs0XSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzVdICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTg7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9NQUNfU09VUkNFOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gMTggKSAgewogICAgICAgICAgICAgICAgQXNmTWFjMkFzY2koIHBCdWYrMSwgcExlbiwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNTb3VyY2UgKTsKICAgICAgICAgICAgICAgICpwQnVmID0gKFNLX1U4KSAqcExlbjsKICAgICAgICAgICAgICAgICgqcExlbikrKzsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfTUFDX1NPVVJDRTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVswXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNTb3VyY2VbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVsyXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNTb3VyY2VbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVs0XSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNTb3VyY2VbNV0gKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSAxODsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0NPTU1VTklUWV9OQU1FOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNjQgKSAgewogICAgICAgICAgICAgICAgZm9yKCAqcExlbj0wOyAqcExlbjw2MzsgKCpwTGVuKSsrICApICB7CiAgICAgICAgICAgICAgICAgICAgKihwQnVmICsgKnBMZW4gKyAxICkgPSBwQUMtPkFzZkRhdGEuTWliLkNvbW11bml0eU5hbWVbKnBMZW5dOwoKICAgICAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lWypwTGVuXSAhPSAwICkgIHsKICAgICAgICAgICAgICAgICAgICAgICAgKihwQnVmICsgKnBMZW4gKyAxICkgPSBwQUMtPkFzZkRhdGEuTWliLkNvbW11bml0eU5hbWVbKnBMZW5dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICpwQnVmID0gKFNLX1U4KSAqcExlbjsKICAgICAgICAgICAgICAgICgqcExlbikrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDY0OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfUlNQX0VOQToKICAgICAgICAgICAgaWYoICpwTGVuID49IDEgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1U4ICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlOwogICAgICAgICAgICAgICAgKnBMZW4gPSAxOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SU1BfRU5BOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gMTsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1JFVFJBTlNfQ09VTlRfTUlOOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNCApICB7CiAgICAgICAgICAgICAgICAqKCAoU0tfVTMyICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0NvdW50TWluOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0NPVU5UX01JTjogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNDb3VudE1pbiApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0NPVU5UX01BWDoKICAgICAgICAgICAgaWYoICpwTGVuID49IDQgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1UzMiAqKSBwQnVmICkgPSBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNDb3VudE1heDsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUkVUUkFOU19DT1VOVF9NQVg6ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zQ291bnRNYXggKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfUkVUUkFOU19JTlRfTUlOOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNCApICB7CiAgICAgICAgICAgICAgICAqKCAoU0tfVTMyICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludE1pbiAvIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9SRVRSQU5TX0lOVF9NSU46ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50TWluICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1JFVFJBTlNfSU5UX01BWDoKICAgICAgICAgICAgaWYoICpwTGVuID49IDQgKSAgewogICAgICAgICAgICAgICAgKiggKFNLX1UzMiAqKSBwQnVmICkgPSBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnRNYXggLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfUkVUUkFOU19JTlRfTUFYOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludE1heCApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQ7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9IQl9JTlRfTUlOOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNCApICB7CiAgICAgICAgICAgICAgICAqKCAoU0tfVTMyICopIHBCdWYgKSA9IHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNaW4gLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfSEJfSU5UX01JTjogJWRcbiIsICBwQUMtPkFzZkRhdGEuTWliLkhiSW50TWluICkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0hCX0lOVF9NQVg6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSA0ICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VMzIgKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5IYkludE1heCAvIEFTRl9HVUlfVFNGOwogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9IQl9JTlRfTUFYOiAlZFxuIiwgIHBBQy0+QXNmRGF0YS5NaWIuSGJJbnRNYXggKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfV0RfVElNRV9NSU46CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSA0ICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VMzIgKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNaW4gLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfV0RfVElNRV9NSU46ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNaW4gKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfV0RfVElNRV9NQVg6CiAgICAgICAgICAgIGlmKCAqcExlbiA+PSA0ICkgIHsKICAgICAgICAgICAgICAgICooIChTS19VMzIgKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNYXggLyBBU0ZfR1VJX1RTRjsKICAgICAgICAgICAgICAgICpwTGVuID0gNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfV0RfVElNRV9NQVg6ICVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWVNYXggKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSA0OwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfR1VJRDoKICAgICAgICAgICAgaWYoICpwTGVuID49IDMzICkgIHsKICAgICAgICAgICAgICAgIEFzZkFycmF5MkhleCggcEJ1ZisxLCAxNiwgcEFDLT5Bc2ZEYXRhLk1pYi5HdWlkICk7CiAgICAgICAgICAgICAgICAqcEJ1ZiA9IDMyOwogICAgICAgICAgICAgICAgKnBMZW4gPSAzMzsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfR1VJRFxuIiApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDMzOwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX09QOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gNDEgKSAgewogICAgICAgICAgICAgICAgQXNmQXJyYXkySGV4KCBwQnVmKzEsIDQwLCBwQUMtPkFzZkRhdGEuTWliLktleU9wZXJhdG9yICk7CiAgICAgICAgICAgICAgICAqcEJ1ZiA9IChTS19VOCkgNDA7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQxOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9LRVlfT1A6XG4gPiIpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPFJTUF9LRVlMRU5HVEg7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIscEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvcltpXSApKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIjxcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQxOwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX0FETToKICAgICAgICAgICAgaWYoICpwTGVuID49IDQxICkgIHsKICAgICAgICAgICAgICAgIEFzZkFycmF5MkhleCggcEJ1ZisxLCA0MCwgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlBZG1pbmlzdHJhdG9yICk7CiAgICAgICAgICAgICAgICAqcEJ1ZiA9IChTS19VOCkgNDA7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQxOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9LRVlfQURNOlxuID4iKSk7CiAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTxSU1BfS0VZTEVOR1RIOyBpKysgKQogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiUwMngiLHBBQy0+QXNmRGF0YS5NaWIuS2V5QWRtaW5pc3RyYXRvcltpXSApKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIjxcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDQxOwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfS0VZX0dFTjoKICAgICAgICAgICAgaWYoICpwTGVuID49IDQxICkgIHsKICAgICAgICAgICAgICAgIEFzZkFycmF5MkhleCggcEJ1ZisxLCA0MCwgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlHZW5lcmF0b3IgKTsKICAgICAgICAgICAgICAgICpwQnVmID0gKFNLX1U4KSA0MDsKICAgICAgICAgICAgICAgICpwTGVuID0gNDE7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0tFWV9HRU46XG4gPiIpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPFJTUF9LRVlMRU5HVEg7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIscEFDLT5Bc2ZEYXRhLk1pYi5LZXlHZW5lcmF0b3JbaV0gKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCI8XG4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgKnBMZW4gPSA0MTsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1BBUl8xOgogICAgICAgICAgICBpZiggKnBMZW4gPj0gMSApICB7CiAgICAgICAgICAgICAgICAqKCAoU0tfVTggKikgcEJ1ZiApID0gcEFDLT5Bc2ZEYXRhLk1pYi5SZXNlcnZlZFtJZC1PSURfU0tHRV9BU0ZfUEFSXzFdOwogICAgICAgICAgICAgICAgKnBMZW4gPSAxOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9QQVJfWDogLS1cbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAqcExlbiA9IDE7CiAgICAgICAgICAgICAgICBSZXRDb2RlID0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE9JRF9TS0dFX0FTRl9GV1ZFUl9PSUQ6CiAgICAgICAgICAgIC8vIHJldHVybnMgdGhlIGZpcm13YXJlIHJldmlzaW9uIHRvIEdVSQogICAgICAgICAgICBpZiAoKnBMZW4gPj0gQVNGX0ZXVkVSX01BWEJVRkZMRU5HVEgpIHsKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgQVNGX0ZXVkVSX01BWEJVRkZMRU5HVEg7IGkrKyApIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgbG9jayB0aGUgYWNjZXNzIHRvIEZ3VmVyc2lvblN0cmluZyBhZ2FpbnN0IHJlYWRpbmcvd3JpdGluZyBhdCB0aGUgc2FtZSB0aW1lPwogICAgICAgICAgICAgICAgICAgICooKFNLX1U4ICopcEJ1ZitpKSA9IHBBQy0+QXNmRGF0YS5Gd1ZlcnNpb25TdHJpbmdbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqcExlbiA9IEFTRl9GV1ZFUl9NQVhCVUZGTEVOR1RIOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRF9TS0dFX0FTRl9GV1ZFUl9PSUQ6ICVkXG4iLCAqcExlbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gc2V0IHRoZSByaWdodCBsZW5ndGgKICAgICAgICAgICAgICAgICpwTGVuICAgPSBBU0ZfRldWRVJfTUFYQlVGRkxFTkdUSDsKICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX0FDUElfT0lEOgogICAgICAgICAgICAvLyByZXR1cm5zIEFDUEkvQVNGIHRhYmxlIChBU0ZfQUNQSV9NQVhCVUZGTEVOR1RIIGJ5dGVzKSB0byBHVUkKICAgICAgICAgICAgaWYgKCAocEFDLT5Bc2ZEYXRhLk1pYi5BY3BpLmxlbmd0aCA+IDApICYmIChwQUMtPkFzZkRhdGEuTWliLkFjcGkubGVuZ3RoIDw9IEFTRl9BQ1BJX01BWEJVRkZMRU5HVEgpICkgewogICAgICAgICAgICAgICAgaWYgKCpwTGVuID49IHBBQy0+QXNmRGF0YS5NaWIuQWNwaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gYnVmZmVyIGZvciByZXBvcnRpbmcgQUNQSSBidWZmZXIKICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHBBQy0+QXNmRGF0YS5NaWIuQWNwaS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgbG9jayB0aGUgYWNjZXNzIHRvIEFjcGkuYnVmZmVyIGFnYWluc3QgcmVhZGluZy93cml0aW5nIGF0IHRoZSBzYW1lIHRpbWU/CiAgICAgICAgICAgICAgICAgICAgICAgICooKFNLX1U4ICopcEJ1ZitpKSA9IHBBQy0+QXNmRGF0YS5NaWIuQWNwaS5idWZmZXJbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICpwTGVuID0gcEFDLT5Bc2ZEYXRhLk1pYi5BY3BpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgT0lEX1NLR0VfQVNGX0FDUElfT0lEOiAlZFxuIiwgKnBMZW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gYnVmZmVyIHRvIHJlcG9ydCBBQ1BJIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICpwTGVuICAgPSBBU0ZfQUNQSV9NQVhCVUZGTEVOR1RIOwogICAgICAgICAgICAgICAgICAgIFJldENvZGUgPSBTS19QTk1JX0VSUl9UT09fU0hPUlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBubyBidWZmZXIgdG8gcmVwb3J0CiAgICAgICAgICAgICAgICAqcExlbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgT0lEX1NLR0VfQVNGX1NNQlVTX09JRDoKICAgICAgICAgICAgLy8gc2V0IGEgcmVxdWVzdCBmbGFnLCB0aGF0IHNtYnVzIGluZm8gbXVzdCBiZSB1cGRhdGVkCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuU01CdXMuVXBkYXRlUmVxID0gMTsKICAgICAgICAgICAgLy8gcmV0dXJucyBTTUJ1cyB0YWJsZSBHVUkKICAgICAgICAgICAgaWYgKCAocEFDLT5Bc2ZEYXRhLk1pYi5TTUJ1cy5sZW5ndGggPiAwKSAmJiAocEFDLT5Bc2ZEYXRhLk1pYi5TTUJ1cy5sZW5ndGggPD0gQVNGX1NNQlVTX01BWEJVRkZMRU5HVEgpICkgewogICAgICAgICAgICAgICAgaWYgKCpwTGVuID49IHBBQy0+QXNmRGF0YS5NaWIuU01CdXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIGJ1ZmZlciBmb3IgcmVwb3J0aW5nIEFDUEkgYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heWJlIHdlIHNob3VsZCBsb2NrIHRoZSBhY2Nlc3MgdG8gU01CdXMuYnVmZmVyIGFnYWluc3QgcmVhZGluZy93cml0aW5nIGF0IHRoZSBzYW1lIHRpbWU/CiAgICAgICAgICAgICAgICAgICAgICAgICooKFNLX1U4ICopcEJ1ZitpKSA9IHBBQy0+QXNmRGF0YS5NaWIuU01CdXMuYnVmZmVyW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAqcExlbiA9IHBBQy0+QXNmRGF0YS5NaWIuU01CdXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBPSURfU0tHRV9BU0ZfU01CVVNfT0lEOiAlZFxuIiwgKnBMZW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgaW4gYnVmZmVyIHRvIHJlcG9ydCBTTUJ1cyBidWZmZXIKICAgICAgICAgICAgICAgICAgICAqcExlbiAgID0gQVNGX1NNQlVTX01BWEJVRkZMRU5HVEg7CiAgICAgICAgICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1RPT19TSE9SVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIG5vIGJ1ZmZlciB0byByZXBvcnQKICAgICAgICAgICAgICAgICpwTGVuID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBPSURfU0tHRV9BU0ZfSEJfQ0FQOgogICAgICAgICAgICAvLyBvaWQgbm90IHVzZWQKICAgICAgICAgICAgKnBMZW4gPSAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgKnBMZW4gICA9IDA7CiAgICAgICAgICAgIFJldENvZGUgPSBTS19BU0ZfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRDsKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIE9JRCBub3Qgc3VwcG9ydGVkXG4iLCAgcEFDLT5Bc2ZEYXRhLk1pYi5FbmEgKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybihSZXRDb2RlKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICAgU2tBc2ZHZXQgLQoqCiogQ29udGV4dDoKKiAgIGluaXQsIHBhZ2VhYmxlCioKKiBSZXR1cm5zOgoqLwppbnQgU2tBc2ZHZXQoCiAgICAgICAgICAgIFNLX0FDICpwQUMsICAgIC8qIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KICAgICAgICAgICAgU0tfSU9DIElvQywgLyogSS9PIGNvbnRleHQgKi8KICAgICAgICAgICAgU0tfVTggKnBCdWYsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcExlbikKewogICAgU0tfVTMyICBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX09LOwoKICAgIHJldHVybihSZXRDb2RlKSA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIFNrQXNmUHJlU2V0IC0KKgoqIENvbnRleHQ6CiogICBpbml0LCBwYWdlYWJsZQoqCiogUmV0dXJuczoKKi8KaW50IFNrQXNmUHJlU2V0KAogICAgICAgICAgICAgICBTS19BQyAqcEFDLCAvKiB0aGUgYWRhcHRlciBjb250ZXh0ICovCiAgICAgICAgICAgICAgIFNLX0lPQyBJb0MsIC8qIEkvTyBjb250ZXh0ICovCiAgICAgICAgICAgICAgIFNLX1U4ICpwQnVmLAogICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBMZW4pCnsKICAgIC8qIHByZXNldCB0aGUgUmV0dXJuIGNvZGUgdG8gZXJyb3IgKi8KICAgIFNLX1UzMiAgUmV0Q29kZSA9IFNLX0FTRl9QTk1JX0VSUl9PSzsKCiAgICByZXR1cm4oUmV0Q29kZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICAgU2tBc2ZTZXQgLQoqCiogQ29udGV4dDoKKiAgIGluaXQsIHBhZ2VhYmxlCioKKiBSZXR1cm5zOgoqLwppbnQgU2tBc2ZTZXQoCiAgICAgICAgICAgIFNLX0FDICpwQUMsIC8qIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KICAgICAgICAgICAgU0tfSU9DIElvQywgLyogSS9PIGNvbnRleHQgKi8KICAgICAgICAgICAgU0tfVTggKnBCdWYsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcExlbikKewogICAgU0tfVTMyICBSZXRDb2RlID0gU0tfQVNGX1BOTUlfRVJSX09LOwoKICAgIHJldHVybihSZXRDb2RlKTsKfQoKU0tfSTggU2tBc2ZTdGFydFdyaXRlRGVmZXJyZWRGbGFzaCggU0tfQUMgKnBBQywgU0tfSU9DIElvQyApICB7CiAgICBTS19JOAlSZXRDb2RlOwogICAgU0tfRVZQQVJBCUV2ZW50UGFyYW07CgogICAgUmV0Q29kZSA9IDE7CiAgICBpZiggcEFDLT5Bc2ZEYXRhLlN0YXRlV3JTcGkgPT0gMCApICB7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLlN0YXRlV3JTcGkrKzsKICAgICAgICBTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKICAgICAgICBTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkFzZkRhdGEuQXNmVGltZXJXclNwaSwKICAgICAgICAgICAgICAgICAgICAgMTAwMDAsIFNLR0VfQVNGLCBTS19BU0ZfRVZUX1RJTUVSX1NQSV9FWFBJUkVELAogICAgICAgICAgICAgICAgICAgICBFdmVudFBhcmFtKTsKICAgICAgICBSZXRDb2RlID0gMDsKICAgIH0KCiAgICByZXR1cm4oIFJldENvZGUgKTsKfQoKU0tfSTggU2tBc2ZXcml0ZURlZmVycmVkRmxhc2goIFNLX0FDICpwQUMsIFNLX0lPQyBJb0MgKSAgewogICAgU0tfSTggICAgICAgUmV0Q29kZTsKICAgIFNLX1U4ICAgICAgIFN0YXJ0QWdhaW47CgogICAgUmV0Q29kZSA9IDE7ICAvLyAgdW5zdWNjZXNzZnVsbAogICAgU3RhcnRBZ2FpbiA9IDA7CgogICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgIFdyaXRlRGVmZXJyZWRGbGFzaDogIFN0YXRlOiVkXG4iLCBwQUMtPkFzZkRhdGEuU3RhdGVXclNwaSApKTsKCiNpZmRlZiBfWFhYXwoKICAgIHN3aXRjaCggcEFDLT5Bc2ZEYXRhLlN0YXRlV3JTcGkgKSAgewogICAgICAgIGNhc2UgMDogIC8vICBpZGxlIFN0YXRlCiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgICBXcml0ZURlZmVycmVkRmxhc2g6ICBpZGxlXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDE6IC8vICBlcmFzZSBTUEkgZmxhc2ggc2VjdG9yCiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgICBXcml0ZURlZmVycmVkRmxhc2g6ICBFcmFzZSBmbGFzaFxuIikpOwogICAgICAgICAgICBpZiAoc3BpX2ZsYXNoX2VyYXNlKHBBQywgQVNGX1NQSV9TRUNUT1IsIEFTRl9TUElfU0VDVE9SX1NJWkUpICA9PSAwICkgIHsgIC8vICBzdWNjZXNzZnVsbAogICAgICAgICAgICAgICAgUmV0Q29kZSA9IDA7CiAgICAgICAgICAgICAgICBTdGFydEFnYWluID0gMTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5TdGF0ZVdyU3BpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgIFdyaXRlRGVmZXJyZWRGbGFzaDogIEVycm9yIEVyYXNlIGZsYXNoXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvLyAgMTI4ICogMHgxMDAgKDI1NikgIEJ5dGVzCiAgICAgICAgICAgIGlmKCBwQUMtPkFzZkRhdGEuU3RhdGVXclNwaSA8PSAxMjkgKSAgewogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIiAgICAgICAgICBXcml0ZURlZmVycmVkRmxhc2g6ICBXcml0ZSBhZGRyOjB4JXggc2l6ZToweCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTRl9TUElfU0VDVE9SKygocEFDLT5Bc2ZEYXRhLlN0YXRlV3JTcGktMikqMHgxMDApLCAweDEwMCApKTsKICAgICAgICAgICAgICAgIGlmIChzcGlfZmxhc2hfbWFuYWdlKHBBQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQUMtPkFzZkRhdGEuU3BpQnVmWyhwQUMtPkFzZkRhdGEuU3RhdGVXclNwaS0yKSoweDEwMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0ZfU1BJX1NFQ1RPUisoKHBBQy0+QXNmRGF0YS5TdGF0ZVdyU3BpLTIpKjB4MTAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwLCBTUElfV1JJVEUpICA9PSAwICkgewogICAgICAgICAgICAgICAgICAgIFJldENvZGUgPSAwOwogICAgICAgICAgICAgICAgICAgIFN0YXJ0QWdhaW4gPSAxOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5TdGF0ZVdyU3BpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgIFdyaXRlRGVmZXJyZWRGbGFzaDogIEVycm9yIFdyaXRlIGFkZHI6MHgleCBzaXplOjB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0ZfU1BJX1NFQ1RPUisoKHBBQy0+QXNmRGF0YS5TdGF0ZVdyU3BpLTIpKjB4MTAwKSwgMHgxMDAgKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgLy8gIEZpbmlzaAogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgIFdyaXRlRGVmZXJyZWRGbGFzaDogIEZpbmlzaFxuIikpOwogICAgICAgICAgICAgICAgUmV0Q29kZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgfSAgLy8gICBzd2l0Y2goIHBBQy0+QXNmRGF0YS5TdGF0ZVdyU3BpICkKCiAgICBpZiggU3RhcnRBZ2FpbiApICB7CiAgICAgICAgU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CiAgICAgICAgU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Bc2ZEYXRhLkFzZlRpbWVyV3JTcGksCiAgICAgICAgICAgICAgICAgICAgIDEwMDAwLCBTS0dFX0FTRiwgU0tfQVNGX0VWVF9USU1FUl9TUElfRVhQSVJFRCwKICAgICAgICAgICAgICAgICAgICAgRXZlbnRQYXJhbSk7CiAgICB9CiAgICBlbHNlICB7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLlN0YXRlV3JTcGkgPSAwOwogICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV3JpdGVUb0ZsYXNoID0gMDsKICAgIH0KCiNlbmRpZiAvLyAgX1hYWF8KCiAgICByZXR1cm4oIFJldENvZGUgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZFdmVudCAtIEV2ZW50IGhhbmRsZXIKKgoqIERlc2NyaXB0aW9uOgoqICAgSGFuZGxlcyB0aGUgZm9sbG93aW5nIGV2ZW50czoKKiAgIFNLX0FTRl9FVlRfVElNRVJfRVhQSVJFRCBXaGVuIGEgaGFyZHdhcmUgY291bnRlciBvdmVyZmxvd3MgYW4KKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwppbnQgU2tBc2ZFdmVudCgKICAgICAgICAgICAgICBTS19BQyAqcEFDLCAvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLwogICAgICAgICAgICAgIFNLX0lPQyBJb0MsIC8qIElPIGNvbnRleHQgaGFuZGxlICovCiAgICAgICAgICAgICAgU0tfVTMyIEV2ZW50LCAgLyogRXZlbnQtSWQgKi8KICAgICAgICAgICAgICBTS19FVlBBUkEgUGFyYW0pIC8qIEV2ZW50IGRlcGVuZGVudCBwYXJhbWV0ZXIgKi8KewoKICAgIHN3aXRjaChFdmVudCkKICAgIHsKICAgICAgICBjYXNlIFNLX0FTRl9FVlRfVElNRVJfRVhQSVJFRDoKICAgICAgICAgICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIkFTRjogU2tBc2ZFdmVudCAtPiBUaW1lciBleHBpcmVkXG4iICkpOwogICAgICAgICAgICBTa0FzZlRpbWVyKCBwQUMsIElvQyApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBTS19BU0ZfRVZUX1RJTUVSX1NQSV9FWFBJUkVEOgogICAgICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiQVNGOiBTa0FzZkV2ZW50IC0+IFRpbWVyV3JTcGkgZXhwaXJlZCBTdGF0ZTolZFxuIiwKICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuU3RhdGVXclNwaSApKTsKICAgICAgICAgICAgU2tBc2ZXcml0ZURlZmVycmVkRmxhc2goIHBBQywgSW9DICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFNLX0FTRl9FVlRfVElNRVJfSENJX0VYUElSRUQ6CiAgICAgICAgICAgIC8vICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiQVNGOiBTa0FzZkV2ZW50IC0+IFRpbWVyV3JIY2kgZXhwaXJlZCBHbEhjaVN0YXRlOiVkXG4iLAogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlICkpOwogICAgICAgICAgICBTa0FzZkhjaSggcEFDLCBJb0MsIDEgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCJBU0Y6IFNrQXNmRXZlbnQgLT4gVW5rbm93biBFdmVudDoweCV4XG4iLCBFdmVudCApKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4oMCk7IC8qIFN1Y2Nlc3MuICovCn0gLyogU2tBc2ZFdmVudCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTa0FzZlRpbWVyIC0gZ2VuZXJhbCBBU0YgIHRpbWVyCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CiogICBBbHdheXMgMAoqLwp2b2lkIFNrQXNmVGltZXIoClNLX0FDICpwQUMsIC8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovClNLX0lPQyBJb0MgKSAvKiBJTyBjb250ZXh0IGhhbmRsZSAqLyAgewoKICAgIFNLX0VWUEFSQSAgIEV2ZW50UGFyYW07CiAgICBTS19VOCAgICAgICBpLCBOZXdBZGRyOwogICAgU0tfVTggICAgICAgbFJldENvZGU7CiAgICBTS19VOCAgICAgICBUbXBCdWZmZXJbMTI4XTsKICAgIFNLX1U4ICAgICAgIEluZDsKICAgIFNLX1U4ICAgICAgIExlbmd0aDsKICAgIFNLX1U4ICAgICAgICpwSGNpUmVjQnVmOwoKICAgIEFzZldhdGNoQ3B1KHBBQywgSW9DLCA1MCApOwoKICAgIHBIY2lSZWNCdWYgPSBOVUxMOwoKICAgIC8vIGNoZWNrLCB3aGV0aGVyIElQIGFkZHJlc3MgaGFzIGNoYW5nZWQKICAgIE5ld0FkZHIgPSAwOwogICAgZm9yKCBpPTA7IGk8NDsgaSsrICkgIHsKICAgICAgICBpZiggcEFDLT5JcEFkZHJbaV0gIT0gcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVtpXSApICB7CiAgICAgICAgICAgIE5ld0FkZHIgPSAxOwogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBOZXcgSVAgQWRkciBkZXRlY3RlZFxuIikpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5OZXdQYXJhbSA+IDEgKSB7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5OZXdQYXJhbS0tOwogICAgfQoKICAgIHN3aXRjaCggIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlICApICB7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiAgY2hlY2sgZm9yIGNoYW5nZXMgaW4gY29uZmlnIGRhdGEKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGNhc2UgMDoKCSAgCgkgIHN3aXRjaChwQUMtPkFzZkRhdGEuT3BNb2RlKSAgewoJICBjYXNlIFNLX0dFQVNGX01PREVfQVNGOgoJICAgIGlmKHBBQy0+QXNmRGF0YS5MYXN0R2xIY2lTdGF0ZSA9PSAyNTUpIHsKCSAgICAgIHBBQy0+QXNmRGF0YS5MYXN0R2xIY2lTdGF0ZSA9IDA7CgkgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSAgICAgPSAxMDA7ICAvLyAgRmV0Y2ggQVNGIGNvbmZpZ3VyYXRpb24gZnJvbSBGVwoJICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5QYXR0VXBSZXEgID0gMTsgICAgLy8gLi4uYW5kIHVwZGF0ZSBwYXR0ZXJuIHJhbQoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgIGlmICggKHBBQy0+QXNmRGF0YS5NaWIuU01CdXMuVXBkYXRlUmVxID49IDEpICYmIChwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9PSAwKSApIHsKCQkvLyBsb2NrIHRoaXMgbWVjaGFuaXNtLCBpZiB0aGUgR2xIY2lTdGF0ZSBnb2VzIHJlYWxseSB0byB0aGUgIlNNQnVzIHVwZGF0ZSBzdGF0ZSIKCQkvLyBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLlVwZGF0ZVJlcSA9IDA7CgkJCgkJLy8gZ28gdG8gU01CdXMgdXBkYXRlIHN0YXRlCgkJcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyMDsKCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJHbyB0byBTdGF0ZSAyMFxuIikpOwoJICAgICAgfQoJICAgICAgCgkgICAgICBpZiAoIChwQUMtPkFzZkRhdGEuTWliLk5ld1BhcmFtID09IDEpIHx8IChOZXdBZGRyICYmIHBBQy0+QXNmRGF0YS5NaWIuRW5hKSkgIHsKCQlwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDUwOwoJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFN0YXJ0IFVwZGF0ZSBBU0YgY29uZmlnIGRhdGFcbiIpKTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgCgkgICAgICBpZiAoIHBBQy0+QXNmRGF0YS5WcGRJbml0T2sgPT0gMCApICB7CgkJcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAxOwoJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFN0YXJ0IEluaXQgVnBkIFxuIikpOwoJICAgICAgfQoJICAgIH0KI2lmZGVmIEFTRl9GV19XRAoJICAgIC8vICBGVyBXRCBmdW5jdGlvbmFsaXR5CgkgICAgaWYoIHBBQy0+QXNmRGF0YS5Gd1dkSW50ZXJ2YWxsID4gMSApCgkgICAgICBwQUMtPkFzZkRhdGEuRndXZEludGVydmFsbC0tOwoJICAgIGlmKCBwQUMtPkFzZkRhdGEuRndXZEludGVydmFsbCA9PSAxICkgIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMTsgIC8vICBnbyB0byBjaGVjayBhbGl2ZQoJICAgIH0KI2VuZGlmCgkgICAgYnJlYWs7CgkgICAgCgkgIGNhc2UgU0tfR0VBU0ZfTU9ERV9JUE1JOgoKCSAgICBpZiAoIChOZXdBZGRyID09IDEpIHx8CgkJIChwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCAgICE9IChTS19VOCkocEFDLT5BY3RpdmVQb3J0ICYgMHhmZikpIHx8CgkJIChwQUMtPkFzZkRhdGEuUHJlZlBvcnQgICAgICE9IChTS19VOCkocEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAmIDB4ZmYpKSB8fAoJCSAocEFDLT5Bc2ZEYXRhLk1pYi5SbG10TW9kZSAhPSAoU0tfVTgpKHBBQy0+UmxtdC5OdW1OZXRzICYgMHhmZikpICkgewoJICAgICAgCgkgICAgICAvLyBjb25maWcgaGFzIGNoYW5nZWQgZm9yIElQTUkKCSAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMzA7CgkgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCgkJCSAoIlNrQXNmVGltZXI6IElQTUkgdXBkYXRlIGNvbmZpZyB3aXRoICVkIDB4JTA4eCAweCUwOHhcbiIsCgkJCSAgTmV3QWRkciwgcEFDLT5BY3RpdmVQb3J0LCBwQUMtPlJsbXQuTmV0WzBdLlByZWZQb3J0LCBwQUMtPlJsbXQuTnVtTmV0cykpOwoJICAgIH0KCSAgICAKCSAgICAvLyBjaGVjayB0aGUgaXBtaSBmaXJtd2FyZQoJICAgIGlmKCBwQUMtPkFzZkRhdGEuRndXZEludGVydmFsbCA+IDEgKSB7CgkgICAgICBwQUMtPkFzZkRhdGEuRndXZEludGVydmFsbC0tOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMTsgIC8vICBnbyB0byBjaGVjayBhbGl2ZQoJICAgIH0KCSAgICAKCSAgICBicmVhazsKCSAgICAKCSAgY2FzZSBTS19HRUFTRl9NT0RFX0RBU0g6CgkgICAgaWYgKCBOZXdBZGRyID09IDEgKXsKCSAgICAgIC8vIGNvbmZpZyBoYXMgY2hhbmdlZCBmb3IgREFTSAoKCSAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gNDA7CgkgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCgkJCSAoIlNrQXNmVGltZXI6IERBU0ggdXBkYXRlIGNvbmZpZyB3aXRoIE5ld0FkZHI6ICVkXG4iLE5ld0FkZHIgKSk7CgkgICAgfQoJICAgIAoJICAgIC8vIGNoZWNrIHRoZSBEQVNIIGZpcm13YXJlCgkgICAgaWYoIHBBQy0+QXNmRGF0YS5Gd1dkSW50ZXJ2YWxsID4gMSApIHsKCSAgICAgIHBBQy0+QXNmRGF0YS5Gd1dkSW50ZXJ2YWxsLS07CgkgICAgfQoJICAgIGVsc2UgewoJICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAxOyAgLy8gIGdvIHRvIGNoZWNrIGFsaXZlCgkgICAgfQoJICAgIAoJICAgIC8vaWYoIEFzZkhjaVNlbmRDb21tYW5kKCBwQUMsIElvQywgWUFTRl9IT1NUQ01EX0RSVl9IRUxMTywgMCwgMCwgMCwgQVNGX0hDSV9XQUlULCAzICkgIT0gSENJX0VOX0NNRF9SRUFEWSApICB7CgkgICAgLy8gIHByaW50aygiQVNGOiBEUlZfSEVMTE8gZmFpbGVkXG4iKTsKCSAgICAvL30gZWxzZSB7CgkgICAgLy8gIHByaW50aygiQVNGOiBEUlZfSEVMTE8gT0tcbiIpOwoJICAgIC8vfQoJICAgIAoJICAgIGJyZWFrOwoJICAgIAoJICBkZWZhdWx0OgoJICAgIHByaW50aygiVW5rbm93IE1vZGVcbiIpOwoKCSAgICBicmVhazsKCSAgfQoJICAKCSAgYnJlYWs7CgkgIAogICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgKiAgRG8gVlBEIGluaXQKICAgICAgICAgICAgICogIER1ZSB0byB0aGUgU1BJL1ZQRCBwcm9ibGVtIChBMSksIFZwZEluaXQgTVVTVCBOT1QgYmUgaW52b2tlZCB3aGlsZSB0aGUgQVNGIEZXIGlzIHJ1bm5pbmcgZnJvbSBmbGFzaC4KICAgICAgICAgICAgICogIFRoZXJlZm9yZSB3ZSBkbyBpdCBoZXJlLCB3aGlsZSB0aGUgQVNGIEZXIGlzIHJ1bm5pbmcgaW4gdGhlIFJhbUlkbGVMb29wCiAgICAgICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0hFQ0tfQUxJVkUsIDAsIDAsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCiAgICAgICAgICAgICAgICAvLyAgICAoIlNrQXNmVGltZXI6ICoqKiBDUFUgaXMgcnVubmluZyAoJWQpICoqKlxuIiwgcEFDLT5Bc2ZEYXRhLk9wTW9kZSkpOwogICAgICAgICAgICAgICAgLy8gQ2hlY2tBbGl2ZSB3YXMgaW5pdGlhdGVkIGJ5IFdECiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkZ3V2RJbnRlcnZhbGwgPT0gMSApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5Gd1dkSW50ZXJ2YWxsID0gMTA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiAqKiogQ1BVIGlzIE5PVCBydW5uaW5nICEhISAqKipcbiIpKTsKICAgICAgICAgICAgICAgIEFzZlJlc2V0Q3B1KCBwQUMsIElvQyApOwogICAgICAgICAgICAgICAgQXNmUnVuQ3B1KCBwQUMsIElvQyApOwogICAgICAgICAgICAgICAgLy8gQ2hlY2tBbGl2ZSB3YXMgaW5pdGlhdGVkIGJ5IFdECiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkZ3V2RJbnRlcnZhbGwgPT0gMSApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5Gd1dkSW50ZXJ2YWxsID0gNjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0VOVEVSX1JBTV9JRExFLCAwLCAwLCAwLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VudCBFTlRFUl9SQU1fSURMRSBcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5WcGRJbml0T2sgPT0gMCApICB7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBWcGRJbml0XG4iKSk7CiAgICAgICAgICAgICAgICBpZiAoVnBkSW5pdChwQUMsIElvQykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5WcGRJbml0T2sgPSAxOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmVGltZXI6IFZQRCBpbml0IG8uay5cbiIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiU2tBc2ZUaW1lcjogVlBEIGluaXQgZXJyb3JcbiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9MRUFWRV9SQU1fSURMRSwgMCwgMCwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbnQgTEVBVkVfUkFNX0lETEUgXG4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX1VQREFURV9PV05fTUFDQUREUiwgMCwgMCwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgaWYocEFDLT5Bc2ZEYXRhLk5ld0d1aWQpCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSA1MDsgICAvLyBXcml0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgdG8gU0VFUFJPTQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgICAgID0gMTAwOyAgLy8gIEZldGNoIEFTRiBjb25maWd1cmF0aW9uIGZyb20gRlcKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlBhdHRVcFJlcSAgPSAxOyAgICAvLyAuLi5hbmQgdXBkYXRlIHBhdHRlcm4gcmFtCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW50IExFQVZFX1JBTV9JRExFIFxuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICogIHVwZGF0ZXMgU01CdXMgc3RydWN0dXJlIHZpYSBIQ0kKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVxdWVzdCBmb3IgdXBkYXRpbmcsIHdlIHdvcmsgaXQgb3V0IGFuZCBnbyB0byBpZGxlIHN0YXRlLgogICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLlVwZGF0ZVJlcSA9IDA7CgogICAgICAgICAgICAvLyBnZXQgU01CdXMgaW5mb3MgZnJvbSBGVwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9TTUJVU19JTkZPUywgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBMZW5ndGggPSAqKHBIY2lSZWNCdWYgKyAxKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFNNQnVzIGluZm8gdXBkYXRlIHZpYSBIQ0kgbDolZFxuIiwgTGVuZ3RoKSkKCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBmb3IoIGk9MDsgKGk8QVNGX1NNQlVTX01BWEJVRkZMRU5HVEgpJiYoaTxMZW5ndGgpOyBpKysgKSAgewogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuU01CdXMubGVuZ3RoICAgKz0gMTsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLmJ1ZmZlcltpXSA9ICoocEhjaVJlY0J1ZisyK2kpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAwOyAvLyBnbyB0byBpZGxlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IpIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiAgSVBNSSBzdGF0ZXMgMzAuLi4zNgogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIC8vIFJMTVQgbW9kZSBoYXMgY2hhbmdlZCAob25seSByZWxldmFudCBpbiBJUE1JIG9wZXJhdGlvbiBtb2RlKQogICAgICAgICAgICAvLyBpbiBJUE1JIG9wZXJhdGlvbiBtb2RlLCB3ZSB1c2UgdGhlICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SU1BfRU5BQkxFIG1lc3NhZ2UKICAgICAgICAgICAgLy8gYXMgaW5kaWNhdG9yIGZvciBSTE1UIG1vZGUgLyBEdWFsIE5ldCBtb2RlCiAgICAgICAgICAgIC8vIHBBQy0+QXNmRGF0YS5NaWIuUmxtdE1vZGUgPiAxICA9PiBEdWFsIE5ldCBNb2RlIE9uCiAgICAgICAgICAgIC8vIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBSTE1UIE1vZGUgT24KCSAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCiAgICAgICAgICAgICAgICAoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9FTkFCTEUgMHgleCAtPiAweCV4XG4iLCBwQUMtPkFzZkRhdGEuTWliLlJsbXRNb2RlLCBwQUMtPlJsbXQuTnVtTmV0cykpOwoKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SbG10TW9kZSA9IChTS19VOCkocEFDLT5SbG10Lk51bU5ldHMgJiAweGZmKTsKCiAgICAgICAgICAgIGlmIChwQUMtPkFzZkRhdGEuTWliLlJsbXRNb2RlID4gMSkgewogICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIER1YWwgbmV0IG1vZGUKICAgICAgICAgICAgICAgIGlmIChwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPT0gU0tfR0VBU0ZfWTJfRFVBTFBPUlQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgcGF0dGVybiBmb3IgcG9ydCBiCiAgICAgICAgICAgICAgICAgICAgWWxjaUVuYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDQpOyAgICAgIC8vIFJTUCBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgWWxjaUVuYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDYpOyAgICAgIC8vIFJNQ1AgcGF0dGVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBwYXR0ZXJuIGZvciBwb3J0IGEKICAgICAgICAgICAgICAgIFlsY2lFbmFibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA0KTsgICAgICAgICAgLy8gUlNQIHBhdHRlcm4KICAgICAgICAgICAgICAgIFlsY2lFbmFibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA2KTsgICAgICAgICAgLy8gUk1DUCBwYXR0ZXJuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SU1BfRU5BQkxFOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMSArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuUmxtdE1vZGU7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDMyOgoJICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0FDVElWRV9QT1JUIGFjdCAweCV4IC0+IDB4JXggcHJlZiAweCV4IC0+IDB4JXhcbiIsIHBBQy0+QXNmRGF0YS5BY3RpdmVQb3J0LCBwQUMtPkFjdGl2ZVBvcnQsIHBBQy0+QXNmRGF0YS5QcmVmUG9ydCwgcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCkpOwoKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkFjdGl2ZVBvcnQgPSAoU0tfVTgpKHBBQy0+QWN0aXZlUG9ydCAmIDB4ZmYpOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuUHJlZlBvcnQgICA9IChTS19VOCkocEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAmIDB4ZmYpOwoKICAgICAgICAgICAgLy8gd3JpdGUgYWx3YXlzIHBhdHRlcm4gZW5hYmxlIGZvciB0aGUgYWN0aXZlIHBvcnQKICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5NaWIuUmxtdE1vZGUgPD0gMSkgewogICAgICAgICAgICAgICAgLy8gd2UgYXJlIGluIHJsbXQgbW9kZQogICAgICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5BY3RpdmVQb3J0ID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocEFDLT5Bc2ZEYXRhLkR1YWxNb2RlID09IFNLX0dFQVNGX1kyX0RVQUxQT1JUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBwYXR0ZXJuIGZvciBwb3J0IGIKICAgICAgICAgICAgICAgICAgICAgICAgWWxjaUVuYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDEsIDQpOyAgICAgIC8vIFJTUCBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgIFlsY2lFbmFibGVQYXR0ZXJuKHBBQywgSW9DLCAxLCA2KTsgICAgICAvLyBSTUNQIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgcGF0dGVybiBmb3IgcG9ydCBhCiAgICAgICAgICAgICAgICAgICAgWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA0KTsgICAgICAgICAvLyBSU1AgcGF0dGVybgogICAgICAgICAgICAgICAgICAgIFlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMCwgNik7ICAgICAgICAgLy8gUk1DUCBwYXR0ZXJuCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGUgcGF0dGVybiBmb3IgcG9ydCBhCiAgICAgICAgICAgICAgICAgICAgWWxjaUVuYWJsZVBhdHRlcm4ocEFDLCBJb0MsIDAsIDQpOyAgICAgICAgICAvLyBSU1AgcGF0dGVybgogICAgICAgICAgICAgICAgICAgIFlsY2lFbmFibGVQYXR0ZXJuKHBBQywgSW9DLCAwLCA2KTsgICAgICAgICAgLy8gUk1DUCBwYXR0ZXJuCgogICAgICAgICAgICAgICAgICAgIGlmIChwQUMtPkFzZkRhdGEuRHVhbE1vZGUgPT0gU0tfR0VBU0ZfWTJfRFVBTFBPUlQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBwYXR0ZXJuIGZvciBwb3J0IGIKICAgICAgICAgICAgICAgICAgICAgICAgWWxjaURpc2FibGVQYXR0ZXJuKHBBQywgSW9DLCAxLCA0KTsgICAgIC8vIFJTUCBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgIFlsY2lEaXNhYmxlUGF0dGVybihwQUMsIElvQywgMSwgNik7ICAgICAvLyBSTUNQIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9BQ1RJVkVfUE9SVDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDEgKyAzOyAgLy8gTGVuZ3RoCiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydDsKCiAgICAgICAgICAgIC8vIHByZWZlcnJlZCBwb3J0CiAgICAgICAgICAgIGlmIChwQUMtPkFzZkRhdGEuUHJlZlBvcnQgPT0gMikgewogICAgICAgICAgICAgICAgLy8gbm90ZTogMCA9ICJhdXRvIiwgMSA9IHBvcnQgQSwgMiA9IHBvcnQgQiwKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAxOyAgIC8vIHBvcnQgQgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDA7ICAgLy8gcG9ydCBBCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpICkgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsgICAgICAgICAgLy8gbmV4dCBzdGF0ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7ICAgICAgLy8gZXJyb3Igc3RhdGUKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgLy8gQ29tbWVudDogRXJyb3I/IEVtcHR5IElwQWRkciEgLT4gTm8gU1ctQXNzaWdubWVudCBmb3IgdGhlIEJNQy1JUAogICAgICAgICAgICAvLyBwcmludGsoIk9taXR0aW5nIENvbW1hbmQgMzQgPC0gbm90IGltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMzU6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKSAgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsgICAgICAgICAgLy8gZmluaXNjaAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7ICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfRldfVkVSU0lPTl9TVFJJTkcsIDAsIDAsIDEsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBMZW5ndGggPSAqKHBIY2lSZWNCdWYgKyAxKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0ZXX1ZFUlNJT05fU1RSSU5HIGw6JWRcbiIsTGVuZ3RoKSkKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgID4iKSkKICAgICAgICAgICAgICAgIGZvciggaT0wOyAoaTw3OSkmJihpPExlbmd0aCk7IGkrKyApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkZ3VmVyc2lvblN0cmluZ1tpXSAgID0gKihwSGNpUmVjQnVmKzIraSk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkZ3VmVyc2lvblN0cmluZ1tpKzFdID0gMDsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIlYyIscEFDLT5Bc2ZEYXRhLkZ3VmVyc2lvblN0cmluZ1tpXSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCI8XG4iKSkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU0OyAgICAgIC8vIGdvIHRvIGZpbmlzaAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkgewogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7ICAgICAgLy8gZXJyb3Igc3RhdGUKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAvLyBEQVNIIEFTRiBGVyBDTURTICg0MC00OCkKICAgIGNhc2UgNDA6CiAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgNDE6CiAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgNDI6CiAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwKCQkgKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9EQVNIX0VOQUJMRSBcbiIpKTsKICAgICAgSW5kID0gMDsKICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX0RBU0hfRU5BQkxFOwogICAgICBUbXBCdWZmZXJbSW5kKytdID0gMSArIDI7ICAvLyBMZW5ndGgKICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuUmxtdE1vZGU7CiAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDICxJb0MgLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfV0FJVCwgMiApOwogICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICBicmVhazsKICAgICAgCiAgICBjYXNlIDQzOgogICAgICBsUmV0Q29kZSA9IEFzZkhjaUdldFN0YXRlKCBwQUMgKTsKICAgICAgaWYoIChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZKSB8fCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9JRExFKSkgewoJcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgfQoKICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKSB7CglwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgfQogICAgICAKICAgICAgYnJlYWs7CgkgICAgCiAgICBjYXNlIDQ0OgogICAgICAvL1NLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwKICAgICAgLy8JICgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfQUNUSVZFX1BPUlQgYWN0IDB4JXggLT4gMHgleCBwcmVmIDB4JXggLT4gMHgleFxuIiwKICAgICAgLy8JICBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgcEFDLT5BY3RpdmVQb3J0LCBwQUMtPkFzZkRhdGEuUHJlZlBvcnQsIHBBQy0+R2VuZXJhbENvbmZpZy5QcmVmUG9ydCkpOwogICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCgkJICgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfQUNUSVZFX1BPUlQgYWN0IDB4JXggLT4gMHgleFxuIiwKCQkgIHBBQy0+QXNmRGF0YS5BY3RpdmVQb3J0LCBwQUMtPkFjdGl2ZVBvcnQpKTsKCiAgICAgIAogICAgICBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCA9IChTS19VOCkocEFDLT5BY3RpdmVQb3J0ICYgMHhmZik7CiAgICAgIC8vIHBBQy0+QXNmRGF0YS5QcmVmUG9ydCAgID0gKFNLX1U4KShwQUMtPlByZWZQb3J0ICYgMHhmZik7CiAgICAgIAogICAgICBJbmQgPSAwOwogICAgICBUbXBCdWZmZXJbSW5kKytdID0gWUFTRl9IT1NUQ01EX0NGR19TRVRfQUNUSVZFX1BPUlQ7CiAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAxICsgMzsgIC8vIExlbmd0aAogICAgICBUbXBCdWZmZXJbSW5kKytdID0gcEFDLT5Bc2ZEYXRhLkFjdGl2ZVBvcnQ7CiAgICAgIC8vIHByZWZlcnJlZCBwb3J0CiAgICAgIGlmIChwQUMtPkFzZkRhdGEuUHJlZlBvcnQgPT0gMikgewoJLy8gbm90ZTogMCA9ICJhdXRvIiwgMSA9IHBvcnQgQSwgMiA9IHBvcnQgQiwKCVRtcEJ1ZmZlcltJbmQrK10gPSAxOyAgIC8vIHBvcnQgQgogICAgICB9CiAgICAgIGVsc2UgewoJVG1wQnVmZmVyW0luZCsrXSA9IDA7ICAgLy8gcG9ydCBBCiAgICAgIH0KICAgICAgCiAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDICxJb0MgLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgNDU6CiAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwoKICAgICAgaWYoIChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZKSB8fCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9JRExFKSApIHsKCXBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7ICAgICAgICAgIC8vIG5leHQgc3RhdGUKICAgICAgfQogICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApIHsKCXBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OyAgICAgIC8vIGVycm9yIHN0YXRlCiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSA0NjoKICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAoJCSAoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0lQX1NPVVJDRSAlMDNkLiUwM2QuJTAzZC4lMDNkIC0+ICUwM2QuJTAzZC4lMDNkLiUwM2RcbiIsCgkJICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzBdLCBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzFdLCBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzJdLCBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzNdLAoJCSAgcEFDLT5JcEFkZHJbMF0sIHBBQy0+SXBBZGRyWzFdLCBwQUMtPklwQWRkclsyXSwgcEFDLT5JcEFkZHJbM10pKTsKICAgICAgSW5kID0gMDsKICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX0lQX1NPVVJDRTsKICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDQgKyAyOyAgLy8gTGVuZ3RoCgogICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKSB7CglUbXBCdWZmZXJbSW5kKytdID0gcEFDLT5JcEFkZHJbaV07CiAgICAgIH0KCiAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDICxJb0MgLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgIGJyZWFrOwogICAgICAKICAgIGNhc2UgNDc6CiAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKSAgewoJZm9yKCBpPTA7IGk8NDsgaSsrICkgewoJICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlW2ldID0gcEFDLT5JcEFkZHJbaV07Cgl9CglwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOyAgICAgICAgICAvLyBmaW5pc2gKICAgICAgfQogICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApIHsKCXBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OyAgICAgIC8vIGVycm9yCiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgIAogICAgY2FzZSA0ODoKICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMgLElvQyAsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX0ZXX1ZFUlNJT05fU1RSSU5HLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CgkvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQoJQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwoJTGVuZ3RoID0gKihwSGNpUmVjQnVmICsgMSk7CglTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9GV19WRVJTSU9OX1NUUklORyBsOiVkXG4iLExlbmd0aCkpOwoJZm9yKCBpPTA7IChpPDc5KSYmKGk8TGVuZ3RoKTsgaSsrICkgIHsKCSAgcEFDLT5Bc2ZEYXRhLkZ3VmVyc2lvblN0cmluZ1tpXSAgID0gKihwSGNpUmVjQnVmKzIraSk7CgkgIHBBQy0+QXNmRGF0YS5Gd1ZlcnNpb25TdHJpbmdbaSsxXSA9IDA7Cgl9CglwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NDsgICAgICAvLyBnbyB0byBmaW5pc2gKICAgICAgfQogICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApIHsKCXBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OyAgICAgIC8vIGVycm9yIHN0YXRlCiAgICAgIH0KICAgICAgYnJlYWs7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiAgU2VuZCBuZXcgQVNGIGNvbmZpZ3VyYXRpb24gZGF0YSB0byBGVyAoU0VFUFJPTSkKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0FTRl9FTkFCTEUgKi8KICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9BU0ZfRU5BQkxFXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9BU0ZfRU5BQkxFOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMSArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuRW5hOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9FTkFCTEUgKi8KICAgICAgICBjYXNlIDUyOgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SU1BfRU5BQkxFXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SU1BfRU5BQkxFOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMSArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTM6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JFVFJBTlMgKi8KICAgICAgICBjYXNlIDU0OgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SRVRSQU5TXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SRVRSQU5TOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMSArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IChTS19VOCkgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTU6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JFVFJBTlNfSU5UICovCiAgICAgICAgY2FzZSA1NjoKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfUkVUUkFOU19JTlRcbiIpKTsKICAgICAgICAgICAgSW5kID0gMDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JFVFJBTlNfSU5UOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMiArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IChTS19VOCkoKHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCA+PiA4KSAmIDB4MDAwMDAwRkYpOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gKFNLX1U4KSgocEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ID4+IDApICYgMHgwMDAwMDBGRik7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1NzoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogWUFTRl9IT1NUQ01EX0NGR19TRVRfSEJfRU5BQkxFICovCiAgICAgICAgY2FzZSA1ODoKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfSEJfRU5BQkxFXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9IQl9FTkFCTEU7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAxICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gKFNLX1U4KSBwQUMtPkFzZkRhdGEuTWliLkhiRW5hOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTk6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0hCX0lOVCAqLwogICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0hCX0lOVFxuIikpOwogICAgICAgICAgICBJbmQgPSAwOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gWUFTRl9IT1NUQ01EX0NGR19TRVRfSEJfSU5UOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMiArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IChTS19VOCkoKHBBQy0+QXNmRGF0YS5NaWIuSGJJbnQgPj4gOCkgJiAweDAwMDAwMEZGKTsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IChTS19VOCkoKHBBQy0+QXNmRGF0YS5NaWIuSGJJbnQgPj4gMCkgJiAweDAwMDAwMEZGKTsKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kRGF0YShwQUMsIElvQywgVG1wQnVmZmVyLCAwLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDYxOgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaUdldFN0YXRlKCBwQUMgKTsKICAgICAgICAgICAgaWYoIChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZKSB8fCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9JRExFKSkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAvKiBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9EUldEX0VOQUJMRSAqLwogICAgICAgIGNhc2UgNjI6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0RSV0RfRU5BQkxFXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9EUldEX0VOQUJMRTsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDEgKyAyOyAgLy8gTGVuZ3RoCiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAoU0tfVTgpIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmE7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2MzoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogWUFTRl9IT1NUQ01EX0NGR19TRVRfRFJXRF9JTlQgKi8KICAgICAgICBjYXNlIDY0OgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9EUldEX0lOVFxuIikpOwogICAgICAgICAgICBJbmQgPSAwOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gWUFTRl9IT1NUQ01EX0NGR19TRVRfRFJXRF9JTlQ7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAyICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gKFNLX1U4KSgocEFDLT5Bc2ZEYXRhLk1pYi5XZFRpbWUgPj4gOCkgJiAweDAwMDAwMEZGKTsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IChTS19VOCkoKHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lID4+IDApICYgMHgwMDAwMDBGRik7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogWUFTRl9IT1NUQ01EX0NGR19TRVRfSVBfREVTVElOQVRJT04gKi8KICAgICAgICBjYXNlIDY2OgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9JUF9ERVNUSU5BVElPTlxuIikpOwogICAgICAgICAgICBJbmQgPSAwOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gWUFTRl9IT1NUQ01EX0NGR19TRVRfSVBfREVTVElOQVRJT047CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSA0ICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICBmb3IoIGk9MDsgaTw0OyBpKysgKQogICAgICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0W2ldOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0lQX1NPVVJDRSAqLwogICAgICAgIGNhc2UgNjg6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0lQX1NPVVJDRVxuIikpOwogICAgICAgICAgICBJbmQgPSAwOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gWUFTRl9IT1NUQ01EX0NGR19TRVRfSVBfU09VUkNFOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gNCArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBwQUMtPklwQWRkcltpXTsKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kRGF0YShwQUMsIElvQywgVG1wQnVmZmVyLCAwLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaUdldFN0YXRlKCBwQUMgKTsKICAgICAgICAgICAgaWYoIChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZKSB8fCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9JRExFKSkgIHsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDQ7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVtpXSA9IHBBQy0+SXBBZGRyW2ldOwogICAgICAgICAgICAgICAgICAgICNpZmRlZiBBU0ZfRldfQVJQX1JFU09MVkUKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAxNTA7ICAvLyAgZG8gQVJQIHJlc29sdmUKICAgICAgICAgICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKICAgICAgICAvKiBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9NQUNfREVTVElOQVRJT04gKi8KICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBzZW5kaW5nICBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9NQUNfREVTVElOQVRJT05cbiIpKTsKICAgICAgICAgICAgSW5kID0gMDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX01BQ19ERVNUSU5BVElPTjsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDYgKyAyOyAgLy8gTGVuZ3RoCiAgICAgICAgICAgIGZvciggaT0wOyBpPDY7IGkrKyApCiAgICAgICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0W2ldOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0NPTU1VTklUWV9OQU1FICovCiAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfQ09NTVVOSVRZX05BTUVcbiIpKTsKICAgICAgICAgICAgSW5kID0gMDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX0NPTU1VTklUWV9OQU1FOwogICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gMjsgIC8vIExlbmd0aAogICAgICAgICAgICBmb3IoIGk9MDsgaTw2NDsgaSsrICkgIHsKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlclsxXSsrOwogICAgICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5NaWIuQ29tbXVuaXR5TmFtZVtpXTsKICAgICAgICAgICAgICAgIGlmKCBUbXBCdWZmZXJbSW5kLTFdID09IDAgKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3MzoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogWUFTRl9IT1NUQ01EX0NGR19TRVRfUlNQX0tFWV8xICovCiAgICAgICAgY2FzZSA3NDoKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfUlNQX0tFWV8xXG4gPiIpKTsKICAgICAgICAgICAgSW5kID0gMDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9LRVlfMTsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDIwICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICBmb3IoIGk9MDsgaTwyMDsgaSsrICkgIHsKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLktleU9wZXJhdG9yW2ldOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIscEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvcltpXSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJcbiIgKSk7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3NToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLyogWUFTRl9IT1NUQ01EX0NGR19TRVRfUlNQX0tFWV8yICovCiAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogc2VuZGluZyAgWUFTRl9IT1NUQ01EX0NGR19TRVRfUlNQX0tFWV8yXG4gPiIpKTsKICAgICAgICAgICAgSW5kID0gMDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9LRVlfMjsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDIwICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICBmb3IoIGk9MDsgaTwyMDsgaSsrICkgIHsKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBwQUMtPkFzZkRhdGEuTWliLktleUFkbWluaXN0cmF0b3JbaV07CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIlMDJ4IixwQUMtPkFzZkRhdGEuTWliLktleUFkbWluaXN0cmF0b3JbaV0gKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4iICkpOwogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmREYXRhKHBBQywgSW9DLCBUbXBCdWZmZXIsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzc6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggKGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpIHx8IChsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0lETEUpKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8qIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9LRVlfMyAqLwogICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX1JTUF9LRVlfM1xuID4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9SU1BfS0VZXzM7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAyMCArIDI7ICAvLyBMZW5ndGgKICAgICAgICAgICAgZm9yKCBpPTA7IGk8MjA7IGkrKyApICB7CiAgICAgICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5LZXlHZW5lcmF0b3JbaV07CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIlMDJ4IixwQUMtPkFzZkRhdGEuTWliLktleUdlbmVyYXRvcltpXSApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJcbiIgKSk7CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpewogICAgICAgICAgICAgICAgaWYocEFDLT5Bc2ZEYXRhLkNoaXBNb2RlID09IFNLX0dFQVNGX0NISVBfWTIpIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrPTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIFlBU0ZfSE9TVENNRF9DRkdfU0VUX0FDVElWRV9QT1JUXG4iKSk7CiAgICAgICAgICAgIEluZCA9IDA7CiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQ0ZHX1NFVF9BQ1RJVkVfUE9SVDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDEgKyAzOyAgLy8gTGVuZ3RoCiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydDsKICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IHBBQy0+QXNmRGF0YS5BY3RpdmVQb3J0OyAgICAgLy8gUHJlZmVycmVkIHBvcnQgbm90IHNldCBkaXJlY3RseSBpbiBSTE1UCiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAobFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSkgfHwgKGxSZXRDb2RlID09IEhDSV9FTl9DTURfSURMRSkpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19TVE9SRV9DT05GSUcsIDAsIDAsIDAsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbnQgIFlBU0ZfSE9TVENNRF9DRkdfU1RPUkVfQ09ORklHXG4iKSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDEwMDsKICAgICAgICAgICAgICAgIC8vICBjaGVjaywgd2hldGhlciBBU0YgRW5hYmxlIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5Db25maWdDaGFuZ2UgJiAweDAxICkgIHsKICAgICAgICAgICAgICAgICAgICAvLyBzZXQvcmVzZXQgYXNmIGVuYWJsZQogICAgICAgICAgICAgICAgICAgIGlmKCBwQUMtPkFzZkRhdGEuTWliLkVuYSApICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFzZkVuYWJsZShwQUMsIElvQyApOwogICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGF0dGVybiByYW0KICAgICAgICAgICAgICAgICAgICAgICAgICogKGltcG9ydGFudCBmb3IgdGhlIHZlcnkgZmlyc3QgZW5hYmxlIG9mIEFTRikKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuQ29uZmlnQ2hhbmdlIHw9IDB4MDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQXNmRGlzYWJsZShwQUMsIElvQyApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vICBjaGVjaywgd2hldGhlciBSU1AgRW5hYmxlIGhhcyBjaGFuZ2VkCiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5Db25maWdDaGFuZ2UgJiAweDAyICkgIHsKICAgICAgICAgICAgICAgICAgICBBc2ZTZXRVcFBhdHRlcm4oIHBBQywgSW9DLCAwICk7ICAgICAvLyBQb3J0IDAKICAgICAgICAgICAgICAgICAgICBpZihwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9ZMikgewogICAgICAgICAgICAgICAgICAgICAgICBBc2ZTZXRVcFBhdHRlcm4oIHBBQywgSW9DLCAxICk7IC8vIFBvcnQgMQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuQ29uZmlnQ2hhbmdlID0gMDsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTmV3UGFyYW0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgKiAgR2V0IEFTRiBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBGVyAoU0VFUFJPTSkKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICBjYXNlIDEwMDoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfQVNGX0VOQUJMRSwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuRW5hID0gKihwSGNpUmVjQnVmKzIpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0NGR19HRVRfQVNGX0VOQUJMRToweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkVuYSApKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIH0gIC8vICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxMDE6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX1JTUF9FTkFCTEUsIDAsIDAsIDEsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJzcEVuYWJsZSA9ICoocEhjaVJlY0J1ZisyKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX1JTUF9FTkFCTEU6MHgleCBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Sc3BFbmFibGUgKSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTAyOgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9SRVRSQU5TLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zID0gKihwSGNpUmVjQnVmKzIpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0NGR19HRVRfUkVUUkFOUzoweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnMgKSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTAzOgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9SRVRSQU5TX0lOVCwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCAgPSAoKFNLX1UzMikqKHBIY2lSZWNCdWYrMikpIDw8IDg7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnNJbnQgfD0gKChTS19VMzIpKihwSGNpUmVjQnVmKzMpKSA8PCAwOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0NGR19HRVRfUkVUUkFOU19JTlQ6MHgleCBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5SZXRyYW5zSW50ICkpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDEwNDoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfSEJfRU5BQkxFLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkVuYSA9ICoocEhjaVJlY0J1ZisyKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0hCX0VOQUJMRToweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiRW5hICkpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDEwNToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfSEJfSU5ULCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkludCAgPSAoKFNLX1UzMikqKHBIY2lSZWNCdWYrMikpIDw8IDg7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50IHw9ICgoU0tfVTMyKSoocEhjaVJlY0J1ZiszKSkgPDwgMDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0hCX0lOVDoweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50KSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTA2OgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9EUldEX0VOQUJMRSwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmEgPSAqKHBIY2lSZWNCdWYrMik7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9EUldEX0VOQUJMRToweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLldkRW5hICkpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDEwNzoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfRFJXRF9JTlQsIDAsIDAsIDEsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLldkVGltZSAgPSAoKFNLX1UzMikqKHBIY2lSZWNCdWYrMikpIDw8IDg7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLldkVGltZSB8PSAoKFNLX1UzMikqKHBIY2lSZWNCdWYrMykpIDw8IDA7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9EUldEX0lOVDoweCV4IFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLkhiSW50KSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTA4OgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9JUF9ERVNUSU5BVElPTiwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDQ7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbaV0gID0gKihwSGNpUmVjQnVmKzIraSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9JUF9ERVNUSU5BVElPTiAlZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbMF0sIHBBQy0+QXNmRGF0YS5NaWIuSXBEZXN0WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFsyXSwgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbM10pKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIH0gIC8vICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxMDk6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX0lQX1NPVVJDRSwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDQ7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVtpXSAgPSAqKHBIY2lSZWNCdWYrMitpKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0lQX1NPVVJDRSAlZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVswXSwgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVsyXSwgcEFDLT5Bc2ZEYXRhLk1pYi5JcFNvdXJjZVszXSkpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDExMDoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfTUFDX0RFU1RJTkFUSU9OLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NjsgaSsrICkKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbaV0gID0gKihwSGNpUmVjQnVmKzIraSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0NGR19HRVRfTUFDX0RFU1RJTkFUSU9OICUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFswXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzFdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzNdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbNF0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFs1XSkpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDExMToKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfQ09NTVVOSVRZX05BTUUsIDAsIDAsIDEsIEFTRl9IQ0lfTk9XQUlULCAwICk7CiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBMZW5ndGggPSAqKHBIY2lSZWNCdWYgKyAxKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0NPTU1VTklUWV9OQU1FIGw6JWQgPiIsTGVuZ3RoKSkKICAgICAgICAgICAgICAgIGZvciggaT0wOyAoaTw2MykmJihpPExlbmd0aCk7IGkrKyApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5Db21tdW5pdHlOYW1lW2ldICA9ICoocEhjaVJlY0J1ZisyK2kpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuQ29tbXVuaXR5TmFtZVtpKzFdICA9IDA7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJWMiLHBBQy0+QXNmRGF0YS5NaWIuQ29tbXVuaXR5TmFtZVtpXSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCI8XG4iKSkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIH0gIC8vICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxMTI6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX1JTUF9LRVlfMSwgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKSAgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggcmVjZWl2ZWQgZGF0YSBmcm9tIEhDSSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIEFzZkhjaUdldERhdGEoIHBBQywgJnBIY2lSZWNCdWYgKTsKICAgICAgICAgICAgICAgIExlbmd0aCA9ICoocEhjaVJlY0J1ZiArIDEpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0NGR19HRVRfUlNQX0tFWV8xOiAoJWQpXG4gID4iLCBMZW5ndGgpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyAoaTwyMCkmJihpPExlbmd0aCk7IGkrKyApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvcltpXSAgPSAqKHBIY2lSZWNCdWYrMitpKTsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIlMDJ4IiwgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlPcGVyYXRvcltpXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiPFxuIikpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDExMzoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfUlNQX0tFWV8yLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgTGVuZ3RoID0gKihwSGNpUmVjQnVmICsgMSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9SU1BfS0VZXzI6ICglZClcbiAgPiIsIExlbmd0aCkpOwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IChpPDIwKSYmKGk8TGVuZ3RoKTsgaSsrICkgIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLktleUFkbWluaXN0cmF0b3JbaV0gID0gKihwSGNpUmVjQnVmKzIraSk7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJTAyeCIsIHBBQy0+QXNmRGF0YS5NaWIuS2V5QWRtaW5pc3RyYXRvcltpXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiPFxuIikpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgfSAgLy8gIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTU7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDExNDoKICAgICAgICAgICAgbFJldENvZGUgPSBBc2ZIY2lTZW5kQ29tbWFuZChwQUMsIElvQywgWUFTRl9IT1NUQ01EX0NGR19HRVRfUlNQX0tFWV8zLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgTGVuZ3RoID0gKihwSGNpUmVjQnVmICsgMSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9SU1BfS0VZXzM6ICglZClcbiAgPiIsIExlbmd0aCkpOwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IChpPDIwKSYmKGk8TGVuZ3RoKTsgaSsrICkgIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLktleUdlbmVyYXRvcltpXSAgPSAqKHBIY2lSZWNCdWYrMitpKTsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIlMDJ4IiwgcEFDLT5Bc2ZEYXRhLk1pYi5LZXlHZW5lcmF0b3JbaV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIjxcbiIpKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIH0gIC8vICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxMTU6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX0ZXX1ZFUlNJT05fU1RSSU5HLCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgTGVuZ3RoID0gKihwSGNpUmVjQnVmICsgMSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9GV19WRVJTSU9OX1NUUklORyBsOiVkXG4iLExlbmd0aCkpCiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgICA+IikpCiAgICAgICAgICAgICAgICBmb3IoIGk9MDsgKGk8NzkpJiYoaTxMZW5ndGgpOyBpKysgKSAgewogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5Gd1ZlcnNpb25TdHJpbmdbaV0gICA9ICoocEhjaVJlY0J1ZisyK2kpOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5Gd1ZlcnNpb25TdHJpbmdbaSsxXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiJWMiLHBBQy0+QXNmRGF0YS5Gd1ZlcnNpb25TdHJpbmdbaV0pKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiPFxuIikpCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTE2OgogICAgICAgICAgICAvLyBnZXQgU01CdXMgaW5mb3MgZnJvbSBGVwoKICAgICAgICAgICAgLy8gZG8gbm90IGFzayB0d2ljZQogICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLlVwZGF0ZVJlcSA9IDA7CgogICAgICAgICAgICBsUmV0Q29kZSA9IEFzZkhjaVNlbmRDb21tYW5kKHBBQywgSW9DLCBZQVNGX0hPU1RDTURfQ0ZHX0dFVF9TTUJVU19JTkZPUywgMCwgMCwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKCiAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICBBc2ZIY2lHZXREYXRhKCBwQUMsICZwSGNpUmVjQnVmICk7CiAgICAgICAgICAgICAgICBMZW5ndGggPSAqKHBIY2lSZWNCdWYgKyAxKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX1NNQlVTX0lORk9TIGw6JWRcbiIsIExlbmd0aCkpCgogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5TTUJ1cy5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IChpPEFTRl9TTUJVU19NQVhCVUZGTEVOR1RIKSYmKGk8TGVuZ3RoKTsgaSsrICkgIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLmxlbmd0aCAgICs9IDE7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5TTUJ1cy5idWZmZXJbaV0gPSAqKHBIY2lSZWNCdWYrMitpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIChpJTE2KSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAweCUwMngiLCBwQUMtPkFzZkRhdGEuTWliLlNNQnVzLmJ1ZmZlcltpXSkpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJcbiAgICAgICAgID4gMHglMDJ4IiwgcEFDLT5Bc2ZEYXRhLk1pYi5TTUJ1cy5idWZmZXJbaV0pKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlxuXG4iKSkKICAgICAgICAgICAgICAgIGlmKHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX1kyKSB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKz0yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQoKICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKSB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxMTc6CiAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZENvbW1hbmQocEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DRkdfR0VUX0FDVElWRV9QT1JULCAwLCAwLCAxLCBBU0ZfSENJX05PV0FJVCwgMCApOwogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICAvLyBGZXRjaCByZWNlaXZlZCBkYXRhIGZyb20gSENJIGludGVyZmFjZQogICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgTGVuZ3RoID0gKihwSGNpUmVjQnVmICsgMSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCA9ICoocEhjaVJlY0J1ZiArIDIpOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLlByZWZQb3J0ICAgPSAqKHBIY2lSZWNCdWYgKyAzKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwKICAgICAgICAgICAgICAgICAgICAoIlNrQXNmVGltZXI6IFlBU0ZfSE9TVENNRF9DRkdfR0VUX0FDVElWRV9QT1JUOiAlZCAlZFxuICA+IiwKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgcEFDLT5Bc2ZEYXRhLlByZWZQb3J0KSk7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSsrOwogICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICBpZiggbFJldENvZGUgPT0gSENJX0VOX0NNRF9FUlJPUiApCiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDI1NTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTE4OgogICAgICAgICAgICBpZiAocEFDLT5Bc2ZEYXRhLk1pYi5QYXR0VXBSZXEgIT0gMCkgICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLlBhdHRVcFJlcSA9IDA7CgogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAogICAgICAgICAgICAgICAgICAgICgiU2tBc2ZUaW1lcjogdXBkYXRlIHBhdHRlcm4gaW4gc3RhdGUgJWQgd2l0aCByc3AgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUsIHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlKSk7CgogICAgICAgICAgICAgICAgQXNmU2V0VXBQYXR0ZXJuKHBBQywgSW9DLCAwKTsgICAgICAgLy8gUG9ydCAwCiAgICAgICAgICAgICAgICBpZihwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9ZMikgewogICAgICAgICAgICAgICAgICAgIEFzZlNldFVwUGF0dGVybihwQUMsIElvQywgMSk7ICAgLy8gUG9ydCAxCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPSAyNTQ7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqICBBUlAgcmVzb2x2ZQogICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIGNhc2UgMTUwOgoKI2lmZGVmIEFTRl9GV19BUlBfUkVTT0xWRQogICAgICAgICAgICBpZiAocEFDLT5Bc2ZEYXRhLk9wTW9kZSA9PSBTS19HRUFTRl9NT0RFX0FTRikgewoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmVGltZXI6IHNlbmRpbmcgIEFSUCBSRVFVRVNUXG4iKSk7CiAgICAgICAgICAgICAgICBJbmQgPSAwOwogICAgICAgICAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IFlBU0ZfSE9TVENNRF9BUlBfUkVTT0xWRTsKICAgICAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSA0ICsgMjsgIC8vIExlbmd0aAogICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8NDsgaSsrICkKICAgICAgICAgICAgICAgICAgICBUbXBCdWZmZXJbSW5kKytdID0gcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbaV07CiAgICAgICAgICAgICAgICBBc2ZTZXRVcFBhdHRlcm4oIHBBQywgSW9DLCBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCApOyAgLy8gIHByZXBhcmUgcGF0dGVybiBsb2dpayBmb3IgQVJQIGhhbmRsaW5nCiAgICAgICAgICAgICAgICBZbGNpRW5hYmxlUGF0dGVybiAoIHBBQywgSW9DLCBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgNSApOyAgLy8gIGVuYWJsZSB0aGUgQVJQIHBhdHRlcm4KICAgICAgICAgICAgICAgIEFzZkVuYWJsZShwQUMsIElvQyApOyAgLy8gIGVuYWJsZSBBU0YgbG9naWsgZm9yIHJlY2VpdmluZyBBUlAgcmVzcG9uc2UKICAgICAgICAgICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMSwgQVNGX0hDSV9OT1dBSVQsIDAgKTsKICAgICAgICAgICAgICAgIGlmKCBsUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX1JFQURZICkgIHsKICAgICAgICAgICAgICAgICAgICBZbGNpRGlzYWJsZVBhdHRlcm4gKCBwQUMsIElvQywgcEFDLT5Bc2ZEYXRhLkFjdGl2ZVBvcnQsIDUgKTsgIC8vICBkaXNhYmxlIHRoZSBBUlAgcGF0dGVybgogICAgICAgICAgICAgICAgICAgIGlmKCBwQUMtPkFzZkRhdGEuTWliLkVuYSA9PSAwICkKICAgICAgICAgICAgICAgICAgICAgICAgQXNmRGlzYWJsZShwQUMsIElvQyApOwogICAgICAgICAgICAgICAgICAgIC8vIEZldGNoIHJlY2VpdmVkIGRhdGEgZnJvbSBIQ0kgaW50ZXJmYWNlCiAgICAgICAgICAgICAgICAgICAgQXNmSGNpR2V0RGF0YSggcEFDLCAmcEhjaVJlY0J1ZiApOwogICAgICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDY7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFtpXSAgPSAqKHBIY2lSZWNCdWYrMitpKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoIChwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMF0gPT0gMCkgJiYgKHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFsxXSA9PSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAocEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzJdID09IDApICYmIChwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbM10gPT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFs0XSA9PSAwKSAmJiAocEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzVdID09IDApICAgICkgIHsKICAgICAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiU2tBc2ZUaW1lcjogWUFTRl9IT1NUQ01EX0FSUF9SRVNPTFZFICAgICBOT1QgUkVTT0xWRUQgISFcbiIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJTa0FzZlRpbWVyOiBZQVNGX0hPU1RDTURfQVJQX1JFU09MVkUgJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMF0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFsxXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzNdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbNF0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFs1XSkpOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgICAgICB9ICAvLyAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkgKQogICAgICAgICAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKSAgewogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMjU1OwogICAgICAgICAgICAgICAgICAgIFlsY2lEaXNhYmxlUGF0dGVybiAoIHBBQywgSW9DLCBwQUMtPkFzZkRhdGEuQWN0aXZlUG9ydCwgNSApOyAgICAvLyAgZGlzYWJsZSB0aGUgQVJQIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLk1pYi5FbmEgPT0gMCApCiAgICAgICAgICAgICAgICAgICAgICAgIEFzZkRpc2FibGUocEFDLCBJb0MgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlKys7CiAgICAgICAgICAgIH0KCiNlbHNlICAgLy8gIEFTRl9GV19BUlBfUkVTT0xWRQoKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUrKzsKCiNlbmRpZgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAxNTE6CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gNzA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAqICBGaW5pc2ggc3RhdGUKICAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIGNhc2UgMjU0OgogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiAqKioqKiBGaW5pc2ggKioqKipcbiIpKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkZ3RXJyb3IgPSAwOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZSA9IDA7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTmV3UGFyYW0gPSAwOwogICAgICAgICAgICBwQUMtPkFzZkRhdGEuTGFzdEdsSGNpU3RhdGUgPSBwQUMtPkFzZkRhdGEuR2xIY2lTdGF0ZTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICogIEVycm9yIGhhbmRsaW5nCiAgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYXNlIDI1NToKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZUaW1lcjogKioqKiogRVJST1IgKioqKipcbiIpKTsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkZ3RXJyb3IrKzsKICAgICAgICAgICAgaWYocEFDLT5Bc2ZEYXRhLkZ3RXJyb3IgPiAyKSB7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIqKioqKiBDUFUgUkVTRVQgKioqKipcbiIpKTsKICAgICAgICAgICAgICAgIEFzZlNtYXJ0UmVzZXRDcHUoIHBBQywgSW9DLCBBU0ZfUkVTRVRfSE9UICk7CiAgICAgICAgICAgICAgICBBc2ZSdW5DcHUoIHBBQywgSW9DICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkxhc3RHbEhjaVN0YXRlID0gcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGU7IC8vIFN0b3JlIEVycm9yIFN0YXRlCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID0gMDsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5OZXdQYXJhbSA9IDA7CiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzID0gSENJX0VOX0NNRF9JRExFOwogICAgICAgICAgICBicmVhazsKICAgIH0gIC8vICAgc3dpdGNoKCAgJnBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlID09IDAgICkgIHsKCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgIT0gcEFDLT5Bc2ZEYXRhLkxhc3RHbEhjaVN0YXRlICkgIHsKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZlRpbWVyOiBOZXcgU3RhdGUgJWQgLT4gJWRcbiIsIHBBQy0+QXNmRGF0YS5MYXN0R2xIY2lTdGF0ZSwgcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUpKTsKICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkxhc3RHbEhjaVN0YXRlICE9IDI1NSApIHsgLy8gRG9uJ3Qgb3ZlcndyaXRlIEVycm9yIFN0YXRlLCBpdCB3aWxsIGJlIGNoZWNrZWQgaW4gY2FzZSAwCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5MYXN0R2xIY2lTdGF0ZSA9IHBBQy0+QXNmRGF0YS5HbEhjaVN0YXRlOwogICAgICAgIH0KICAgIH0KCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkdsSGNpU3RhdGUgPT0gMCApICB7ICAvLyAgaWRsZQogICAgICAgIFNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOwogICAgICAgIFNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+QXNmRGF0YS5Bc2ZUaW1lciwKICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMCwgU0tHRV9BU0YsIFNLX0FTRl9FVlRfVElNRVJfRVhQSVJFRCwKICAgICAgICAgICAgICAgICAgICAgRXZlbnRQYXJhbSk7CiAgICB9CiAgICBlbHNlICB7CiAgICAgICAgU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CiAgICAgICAgU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5Bc2ZEYXRhLkFzZlRpbWVyLAogICAgICAgICAgICAgICAgICAgICAzMDAwMCwgU0tHRV9BU0YsIFNLX0FTRl9FVlRfVElNRVJfRVhQSVJFRCwKICAgICAgICAgICAgICAgICAgICAgRXZlbnRQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuOwp9CgojaWYgKDApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmUmVhZENvbmZpZ3VyYXRpb24KKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpORElTX1NUQVRVUyBBc2ZSZWFkQ29uZmlndXJhdGlvbigKSU4gU0tfQUMgKnBBYywKSU4gTkRJU19IQU5ETEUgQ29uZmlnSGFuZGxlLApJTiBORElTX0hBTkRMRSBXcmFwcGVyQ29uZmlnQ29udGV4dCkKewogICAgU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLAogICAgKCJBc2ZSZWFkQ29uZmlndXJhdGlvbiAoTm8gZGF0YSBsb2FkZWQgISlcbiIgKSk7CgogICAgcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKfQojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNrQXNmU2hvd01pYgoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgU2tBc2ZTaG93TWliKCBTS19BQyAqcEFDICkgIHsKCiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiQVNGIE1JQiAoaCk6XG4iKSApOwogICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIi0tLS0tLS0tLS0tLVxuIikgKTsKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCIgICBFbmE6ICAgICAgICAgICAgJWRcbiIsIHBBQy0+QXNmRGF0YS5NaWIuRW5hICkgKTsKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCIgICBSZXRyYW5zOiAgICAgICAgJWQgSW50OiVkXG4iLCBwQUMtPkFzZkRhdGEuTWliLlJldHJhbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuUmV0cmFuc0ludCApICk7CiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiICAgSGJFbmE6ICAgICAgICAgICVkIEludDolZFxuIiwgcEFDLT5Bc2ZEYXRhLk1pYi5IYkVuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5IYkludCApICk7CiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiICAgV2RFbmE6ICAgICAgICAgICVkIFRpbWU6JWRcbiIsIHBBQy0+QXNmRGF0YS5NaWIuV2RFbmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuV2RUaW1lICkgKTsKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCIgICBJcERlc3QgKGQpOiAgICAgJWQuJWQuJWQuJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFswXSwgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwRGVzdFsyXSwgcEFDLT5Bc2ZEYXRhLk1pYi5JcERlc3RbM10gKSApOwogICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIiAgIElwU291cmNlIChkKTogICAlZC4lZC4lZC4lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuSXBTb3VyY2VbMF0sIHBBQy0+QXNmRGF0YS5NaWIuSXBTb3VyY2VbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzJdLCBwQUMtPkFzZkRhdGEuTWliLklwU291cmNlWzNdICkgKTsKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwgKCIgICBNYWNEZXN0OiAgICAgICAgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbMF0sIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjRGVzdFsyXSwgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5NYWNEZXN0WzRdLCBwQUMtPkFzZkRhdGEuTWliLk1hY0Rlc3RbNV0gKSApOwogICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCAoIiAgIE1hY1NvdXJjZTogICAgICAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjU291cmNlWzBdLCBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjU291cmNlWzJdLCBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5NaWIuTWFjU291cmNlWzRdLCBwQUMtPkFzZkRhdGEuTWliLk1hY1NvdXJjZVs1XSApICk7CiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsICgiICAgQ29tbXVuaXR5TmFtZTogID4lczxcbiIsIHBBQy0+QXNmRGF0YS5NaWIuQ29tbXVuaXR5TmFtZSApICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmQ3B1U3RhdGUKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpTS19VOCBBc2ZDcHVTdGF0ZSggU0tfQUMgKnBBQywgU0tfSU9DIElvQyApICB7CiAgU0tfVTMyIFRtcFZhbDMyOwogIAogIFNLX0lOMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCAmVG1wVmFsMzIgKTsKICAKICBpZiggcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlID09IFNLX0dFQVNGX0NISVBfRVggKSAgewogICAgaWYoIChUbXBWYWwzMiYoQklUXzAgfCBCSVRfMSkpID09IDAgKSB7CiAgICAgIHJldHVybiggQVNGX0NQVV9TVEFURV9SRVNFVCApOwogICAgfQogICAgZWxzZSAgaWYgKCAoVG1wVmFsMzImKEJJVF8wIHwgQklUXzEpKSA9PSAxICkgewogICAgICByZXR1cm4oIEFTRl9DUFVfU1RBVEVfUlVOTklORyApOwogICAgfQogICAgZWxzZSAgewogICAgICByZXR1cm4oIEFTRl9DUFVfU1RBVEVfVU5LTk9XTiApOwogICAgfQogIH0KICBlbHNlICB7CiAgICBpZiggVG1wVmFsMzIgJiBCSVRfMyApCiAgICAgIHJldHVybiggQVNGX0NQVV9TVEFURV9SRVNFVCApOwogICAgaWYoIFRtcFZhbDMyICYgQklUXzIgKQogICAgICByZXR1cm4oIEFTRl9DUFVfU1RBVEVfUlVOTklORyApOwogIH0KICAKICByZXR1cm4oIEFTRl9DUFVfU1RBVEVfVU5LTk9XTiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZlJlc2V0Q3B1CioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CioKKi8Kdm9pZCBBc2ZSZXNldENwdShTS19BQyAqcEFDLCBTS19JT0MgSW9DKSAgewogICAgU0tfVTMyIFRtcFZhbDMyOwoKICAgIGlmKCBwQUMtPkFzZkRhdGEuQ2hpcE1vZGUgPT0gU0tfR0VBU0ZfQ0hJUF9FWCApICB7CiAgICAgIFNLX0lOMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCAmVG1wVmFsMzIgKTsKICAgICAgVG1wVmFsMzIgJj0gfihCSVRfMCB8IEJJVF8xKTsKICAgICAgU0tfT1VUMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCBUbXBWYWwzMiApOwogICAgfQogICAgZWxzZSAgewogICAgICBTS19JTjMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgJlRtcFZhbDMyICk7CiAgICAgIFRtcFZhbDMyICY9IH4oQklUXzIgfCBCSVRfMyk7CiAgICAgIFRtcFZhbDMyIHw9IEJJVF8zOwogICAgICBTS19PVVQzMiggSW9DLCBSRUdfQVNGX1NUQVRVU19DTUQsIFRtcFZhbDMyICk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmU21hcnRSZXNldENwdQoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovClNLX1U4IEFzZlNtYXJ0UmVzZXRDcHUoIFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1U4IENvbGQgKSAgewpTS19VNjQgU3RhcnRUaW1lLCBDdXJyVGltZTsKU0tfVTggICBSZXNldENvbW1hbmQ7CgogICAgaWYoIENvbGQgKQogICAgICAgIFJlc2V0Q29tbWFuZCA9IFlBU0ZfSE9TVENNRF9SRVNFVF9DT0xEOwogICAgZWxzZQogICAgICAgIFJlc2V0Q29tbWFuZCA9IFlBU0ZfSE9TVENNRF9SRVNFVDsKCiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJBc2ZTbWFydFJlc2V0Q3B1IC0+IFxuIikpOwoKICAgIC8vICBjaGVjaywgd2hldGhlciBjcHUgaXMgYWxyZWFkeSBpbiByZXNldCBzdGF0ZS4uLgogICAgaWYoIEFzZkNwdVN0YXRlKCBwQUMsIElvQyApICE9IEFTRl9DUFVfU1RBVEVfUkVTRVQgKSAgewogICAgICAgIC8vIC4uLmlmIG5vdCwgdHJ5IFNtYXJ0UmVzZXQKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJBc2ZTbWFydFJlc2V0Q3B1IC0+IFNlbmQgcmVzZXQgY29tbWFuZFxuIikpOwogICAgICAgIGlmKCBBc2ZIY2lTZW5kQ29tbWFuZCggcEFDLCBJb0MsIFJlc2V0Q29tbWFuZCwgMCwgMCwgMCwgQVNGX0hDSV9XQUlULCAyICkgIT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAvLyAgaWYgU21hcnQgUmVzZXQgZmFpbHMsIGRvIGhhcmQgcmVzZXQKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiQXNmU21hcnRSZXNldENwdSAtPiBEbyBoYXJkIHJlc2V0XG4iKSk7CiAgICAgICAgICAgIEFzZlJlc2V0Q3B1KCBwQUMsIElvQyApOwogICAgICAgIH0KICAgICAgICBTdGFydFRpbWUgPSBTa09zR2V0VGltZShwQUMpOwogICAgICAgIHdoaWxlKCBBc2ZDcHVTdGF0ZSggcEFDLCBJb0MgKSAhPSBBU0ZfQ1BVX1NUQVRFX1JFU0VUICkgewogICAgICAgICAgICBDdXJyVGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CiAgICAgICAgICAgIGlmICggKEN1cnJUaW1lIC0gU3RhcnRUaW1lKSA+IChTS19USUNLU19QRVJfU0VDKjEpICkgIHsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIkFzZlNtYXJ0UmVzZXRDcHUgLT4gRXJyb3I6IENQVSBpcyBub3QgaW4gcmVzZXQgc3RhdGUgLSBEbyBoYXJkIHJlc2V0XG4iKSk7CiAgICAgICAgICAgICAgICBBc2ZSZXNldENwdSggcEFDLCBJb0MgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSAgLy8gIHdoaWxlKCBBc2ZDcHVTdGF0ZSggSW9DICkgIT0gQVNGX0NQVV9TVEFURV9SRVNFVCApIHsKCiAgICAgICAgaWYoIEFzZkNwdVN0YXRlKCBwQUMsIElvQyApID09IEFTRl9DUFVfU1RBVEVfUkVTRVQgKQogICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJBc2ZTbWFydFJlc2V0Q3B1IC0+IENQVSBpcyBpbiByZXNldCBzdGF0ZVxuIikpOwoKICAgIH0gIC8vICBpZiggQXNmQ3B1U3RhdGUoIElvQyApICE9IEFTRl9DUFVfU1RBVEVfUkVTRVQgKSAgewogICAgZWxzZSAgewogICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIkFzZlNtYXJ0UmVzZXRDcHUgLT4gQ3B1IGFscmVhZHkgaW4gcmVzZXQgc3RhdGVcbiIpKTsKICAgIH0KCiAgICByZXR1cm4oIDEgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBBc2ZTbWFydFJlc2V0U3RhdGVDcHUKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpTS19VOCBBc2ZTbWFydFJlc2V0U3RhdGVDcHUoIFNLX0FDICpwQUMsIFNLX0lPQyBJb0MgKSAgewoKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNlbmQgQXNmU21hcnRSZXNldFN0YXRlQ3B1XG4iKSk7CiAgICByZXR1cm4oIEFzZkhjaVNlbmRDb21tYW5kKCBwQUMsIElvQywgWUFTRl9IT1NUQ01EX1JFU0VUX1NUQVRFLCAwLCAwLCAwLCBBU0ZfSENJX1dBSVQsIDMgKSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZlJ1bkNwdQoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgQXNmUnVuQ3B1KCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICBTS19VMzIgVG1wVmFsMzI7CiAgCiAgaWYoIHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX0VYICkgIHsKICAgIFNLX0lOMzIoIElvQywgUkVHX0FTRl9TVEFUVVNfQ01ELCAmVG1wVmFsMzIgKTsKICAgIFRtcFZhbDMyIHw9IEJJVF8wOyAgLy8gU2V0IHRvIHJ1bm5pbmcgc3RhdGUKICAgIFNLX09VVDMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgVG1wVmFsMzIgKTsKICB9CiAgZWxzZSAgewogICAgU0tfSU4zMiggSW9DLCBSRUdfQVNGX1NUQVRVU19DTUQsICZUbXBWYWwzMiApOwogICAgVG1wVmFsMzIgJj0gfihCSVRfMiB8IEJJVF8zKTsKICAgIFRtcFZhbDMyIHw9IEJJVF8zOyAgLy8gU2V0IHRvIFJlc2V0IHN0YXRlIChDbGsgcnVubmluZykKICAgIFNLX09VVDMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgVG1wVmFsMzIgKTsKICAgIFRtcFZhbDMyICY9IH4oQklUXzIgfCBCSVRfMyk7CiAgICBUbXBWYWwzMiB8PSBCSVRfMjsgIC8vIFNldCB0byBydW5uaW5nIHN0YXRlCiAgICBTS19PVVQzMiggSW9DLCBSRUdfQVNGX1NUQVRVU19DTUQsIFRtcFZhbDMyICk7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBBc2ZDaGVja0FsaXZlQ3B1CioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CioKKi8KU0tfVTggQXNmQ2hlY2tBbGl2ZUNwdSggU0tfQUMgKnBBQywgU0tfSU9DIElvQyApICB7ClNLX1U4IEFsaXZlOwoKICAgIC8vU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiQXNmQ2hlY2tBbGl2ZUNwdSAtPiBcbiIpKTsKICAgIEFsaXZlID0gMDsgIC8vICBOb3QgYWxpdmUKICAgIC8vICBjaGVjaywgd2hldGhlciBjcHUgaXMgaW4gcmVzZXQgc3RhdGUuLi4KICAgIGlmKCBBc2ZDcHVTdGF0ZSggcEFDLCBJb0MgKSAhPSBBU0ZfQ1BVX1NUQVRFX1JFU0VUICkgIHsKICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJBc2ZTbWFydFJlc2V0Q3B1IC0+IFNlbmQgQ2hlY2sgQWxpdmUgY29tbWFuZFxuIikpOwogICAgICAgIGlmKCBBc2ZIY2lTZW5kQ29tbWFuZCggcEFDLCBJb0MsIFlBU0ZfSE9TVENNRF9DSEVDS19BTElWRSwgMCwgMCwgMCwgQVNGX0hDSV9XQUlULCAyICkgIT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAvLyAgaWYgU21hcnQgUmVzZXQgZmFpbHMsIGRvIGhhcmQgcmVzZXQKICAgICAgICAgICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiQXNmQ2hlY2tBbGl2ZUNwdSAtPiBOb3QgYWxpdmVcbiIpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBBbGl2ZSA9IDE7CiAgICB9ICAvLyAgaWYoIEFzZkNwdVN0YXRlKCBJb0MgKSAhPSBBU0ZfQ1BVX1NUQVRFX1JFU0VUICkgIHsKICAgIGVsc2UgIHsKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJBc2ZDaGVja0FsaXZlQ3B1IC0+ICoqKiBDUFUgaXMgaW4gcmVzZXQgc3RhdGUgKioqXG4iKSk7CiAgICB9CgogICAgcmV0dXJuKCBBbGl2ZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZlNldE9zUHJlc2VudEJpdAoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgQXNmU2V0T3NQcmVzZW50Qml0KCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICAgIFNLX1UzMiBUbXBWYWwzMjsKCQogICAgU0tfSU4zMiggSW9DLCBSRUdfQVNGX1NUQVRVU19DTUQsICZUbXBWYWwzMiApOwogICAgaWYoIHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX0VYICkKICAgICAgICBUbXBWYWwzMiB8PSBCSVRfMjsKCWVsc2UKICAgICAgICBUbXBWYWwzMiB8PSBCSVRfNDsKICAgIFNLX09VVDMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgVG1wVmFsMzIgKTsJCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmUmVzZXRPc1ByZXNlbnRCaXQKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwp2b2lkIEFzZlJlc2V0T3NQcmVzZW50Qml0KCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICAgIFNLX1UzMiBUbXBWYWwzMjsKCiAgICBTS19JTjMyKCBJb0MsIFJFR19BU0ZfU1RBVFVTX0NNRCwgJlRtcFZhbDMyICk7CiAgICBpZiggcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlID09IFNLX0dFQVNGX0NISVBfRVggKQoJICAgIFRtcFZhbDMyICY9IH5CSVRfMjsKCWVsc2UKCSAgICBUbXBWYWwzMiAmPSB+QklUXzQ7CiAgICBTS19PVVQzMiggSW9DLCBSRUdfQVNGX1NUQVRVU19DTUQsIFRtcFZhbDMyICk7CQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZkVuYWJsZUZsdXNoRmlmbwoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgQXNmRW5hYmxlRmx1c2hGaWZvKCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICAgIFNLX1UzMiBUbXBWYWwzMjsKCiAgICAvL0FERAogICAgcmV0dXJuOwoKI2lmZGVmIENISVBfSURfWVVLT05fRVgJCiAgICBTS19JTjMyKCBJb0MsIFJYTUZfVENUTCwgJlRtcFZhbDMyICk7CglUbXBWYWwzMiAmPSB+KEJJVF8yMyB8IEJJVF8yMik7CglUbXBWYWwzMiB8PSBCSVRfMjM7CiAgICBTS19PVVQzMiggSW9DLCBSWE1GX1RDVEwsIFRtcFZhbDMyICk7CQojZW5kaWYKCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmRGlzYWJsZUZsdXNoRmlmbwoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgQXNmRGlzYWJsZUZsdXNoRmlmbyggU0tfQUMgKnBBQyAsIFNLX0lPQyBJb0MpICB7CiAgICBTS19VMzIgVG1wVmFsMzI7CgojaWZkZWYgQ0hJUF9JRF9ZVUtPTl9FWAkKICAgIFNLX0lOMzIoIElvQywgUlhNRl9UQ1RMLCAmVG1wVmFsMzIgKTsKCVRtcFZhbDMyICY9IH4oQklUXzIzIHwgQklUXzIyKTsKCVRtcFZhbDMyIHw9IEJJVF8yMjsKICAgIFNLX09VVDMyKCBJb0MsIFJYTUZfVENUTCwgVG1wVmFsMzIgKTsJCiNlbmRpZgoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBBc2ZMb2NrU3BpCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CioKKi8Kdm9pZCBBc2ZMb2NrU3BpKCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICAgIFNLX1U4IFRtcFZhbDg7CgogICAgU0tfSU44KCBJb0MsIEdQSFlfQ1RSTCArIDIsICZUbXBWYWw4KTsKICAgIFRtcFZhbDggfD0gQklUXzA7CiAgICBTS19PVVQ4KCBJb0MsIEdQSFlfQ1RSTCArIDIsIFRtcFZhbDgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZlVubG9ja1NwaQoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgQXNmVW5sb2NrU3BpKCBTS19BQyAqcEFDLCBTS19JT0MgSW9DICkgIHsKICAgIFNLX1U4IFRtcFZhbDg7CgogICAgU0tfSU44KCBJb0MsIEdQSFlfQ1RSTCArIDIsICZUbXBWYWw4KTsKICAgIFRtcFZhbDggJj0gfkJJVF8wOwogICAgU0tfT1VUOCggSW9DLCBHUEhZX0NUUkwgKyAyLCBUbXBWYWw4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTa0FzZkhjaQoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovCnZvaWQgU2tBc2ZIY2koClNLX0FDICpwQUMsIC8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovClNLX0lPQyBJb0MsClNLX1U4ICAgVG9FbmEgKSAvKiBJTyBjb250ZXh0IGhhbmRsZSAqLyAgewoKICAgIFNLX0VWUEFSQSAgIEV2ZW50UGFyYW07CiAgICBTS19VMzIgICAgICBDbWQ7CiAgICBTS19VMzIgICAgICBTZW5kVmFsdWU7CiAgICBTS19VMzIgICAgICBSZWNWYWx1ZTsKCiAgICBpZiAocEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPT0gSENJX0VOX0NNRF9JRExFKQogICAgICAgIHJldHVybjsKCiAgICBwQUMtPkFzZkRhdGEuSGNpLkN5Y2xlcysrOwoKICAgIC8vIENoZWNrLCB3aGV0aGVyIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbwogICAgU0tfSU4zMiggSW9DLCBBU0ZfSENJX0NNRFJFRywgJkNtZCApOwogICAgaWYoIHBBQy0+QXNmRGF0YS5IY2kuT2xkQ21kUmVnICE9IENtZCApICB7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5PbGRDbWRSZWcgPSBDbWQ7CiAgICAgICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZIY2kgQ21kUmVnOiAweCV4XG4iLCBDbWQgKSk7CiAgICB9CgogICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICAgICAgICAgICAgICBDbWRSZWc6IDB4JXhcbiIsIENtZCApKTsKCiAgICBpZiAoKENtZCAmIChBU0ZfSENJX1JFQUQgfCBBU0ZfSENJX1dSSVRFIHwgQVNGX0hDSV9DTURfUkRfUkVBRFkgfCBBU0ZfSENJX0NNRF9XUl9SRUFEWSB8IEFTRl9IQ0lfVU5TVUNDRVNTKSkgPT0gMCkKICAgIHsKICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZkhjaSBTdGF0ZTogMHgleFxuIiwgcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgKSk7CiAgICAgICAgc3dpdGNoKCBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyApICB7CgogICAgICAgICAgICBjYXNlIEhDSV9FTl9DTURfV1JJVElORzoKICAgICAgICAgICAgICAgIFNlbmRWYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICBpZiAocEFDLT5Bc2ZEYXRhLkhjaS5TZW5kTGVuZ3RoID4gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlNlbmRMZW5ndGgtLTsKICAgICAgICAgICAgICAgICAgICBTZW5kVmFsdWUgPSAoKFNLX1UzMilwQUMtPkFzZkRhdGEuSGNpLlRyYW5zbWl0QnVmW3BBQy0+QXNmRGF0YS5IY2kuU2VuZEluZGV4ICswXSkgPDwgMjQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5IY2kuU2VuZExlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlNlbmRMZW5ndGgtLTsKICAgICAgICAgICAgICAgICAgICAgICAgU2VuZFZhbHVlICs9ICgoU0tfVTMyKXBBQy0+QXNmRGF0YS5IY2kuVHJhbnNtaXRCdWZbcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kSW5kZXggKzFdKSA8PCAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5IY2kuU2VuZExlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU2VuZExlbmd0aC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZFZhbHVlICs9ICgoU0tfVTMyKXBBQy0+QXNmRGF0YS5IY2kuVHJhbnNtaXRCdWZbcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kSW5kZXggKzJdKSA8PCA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5IY2kuU2VuZExlbmd0aCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kTGVuZ3RoLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZFZhbHVlICs9ICgoU0tfVTMyKXBBQy0+QXNmRGF0YS5IY2kuVHJhbnNtaXRCdWZbcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kSW5kZXggKzNdKSA8PCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgU2VuZFZhbHVlOiAweCV4IGw6JWRcbiIsCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRWYWx1ZSwgcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kTGVuZ3RoICkpOwogICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgQVNGX0hDSV9EQVRBUkVHLCBTZW5kVmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHBBQy0+QXNmRGF0YS5IY2kuU2VuZExlbmd0aCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFNLX09VVDMyKCBJb0MsIEFTRl9IQ0lfQ01EUkVHLCBBU0ZfSENJX1dSSVRFIHwgQVNGX0hDSV9DTURfV1JfUkVBRFkgfCBBU0ZfSENJX1VOU1VDQ0VTUyB8IChwQUMtPkFzZkRhdGEuSGNpLlNlbmRJbmRleC80KSk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPSBIQ0lfRU5fQ01EX1dBSVQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgQVNGX0hDSV9DTURSRUcsIEFTRl9IQ0lfV1JJVEUgfCBBU0ZfSENJX1VOU1VDQ0VTUyB8IChwQUMtPkFzZkRhdGEuSGNpLlNlbmRJbmRleC80KSk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kSW5kZXggKz0gNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBIQ0lfRU5fQ01EX1dBSVQ6CiAgICAgICAgICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkhjaS5FeHBlY3RSZXNwb25zZSApICB7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPSBIQ0lfRU5fQ01EX1JFQURJTkc7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgIC8vIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgV2FpdCBmb3IgcmVzcG9uc2VcbiIgKSk7CiAgICAgICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgQVNGX0hDSV9DTURSRUcsIEFTRl9IQ0lfUkVBRCB8IEFTRl9IQ0lfVU5TVUNDRVNTIHwgKHBBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUluZGV4LzQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyA9IEhDSV9FTl9DTURfUkVBRFk7CiAgICAgICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlQnVmWzFdID0gMDsgIC8qTGVuZ3RoKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBIQ0lfRU5fQ01EX1JFQURJTkc6CiAgICAgICAgICAgICAgICBTS19JTjMyKCBJb0MsIEFTRl9IQ0lfREFUQVJFRywgJlJlY1ZhbHVlICk7CiAgICAgICAgICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgIFJlY1ZhbHVlOiAweCV4XG4iLCBSZWNWYWx1ZSApKTsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUJ1ZltwQUMtPkFzZkRhdGEuSGNpLlJlY2VpdmVJbmRleCszXSA9IChTS19VOCkgKFJlY1ZhbHVlID4+ICAwKSAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlJlY2VpdmVCdWZbcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlSW5kZXgrMl0gPSAoU0tfVTgpIChSZWNWYWx1ZSA+PiAgOCkgJiAweDAwMDAwMGZmOwogICAgICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlQnVmW3BBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUluZGV4KzFdID0gKFNLX1U4KSAoUmVjVmFsdWUgPj4gMTYpICYgMHgwMDAwMDBmZjsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUJ1ZltwQUMtPkFzZkRhdGEuSGNpLlJlY2VpdmVJbmRleCswXSA9IChTS19VOCkgKFJlY1ZhbHVlID4+IDI0KSAmIDB4MDAwMDAwZmY7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlJlY2VpdmVJbmRleCAgICs9IDQ7CiAgICAgICAgICAgICAgICAvL1NLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgUmVjVmFsdWU6IDB4JXggUmVjSW5kZXg6JWQgbDolZFxuIiwKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNWYWx1ZSxwQUMtPkFzZkRhdGEuSGNpLlJlY2VpdmVJbmRleCwgcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlQnVmWzFdICkpOwogICAgICAgICAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUJ1ZlsxXSA+IHBBQy0+QXNmRGF0YS5IY2kuUmVjZWl2ZUluZGV4ICkgIHsgLyogY2hlY2sgbGVuZ3RoKi8KICAgICAgICAgICAgICAgICAgICBTS19PVVQzMiggSW9DLCBBU0ZfSENJX0NNRFJFRywgQVNGX0hDSV9SRUFEIHwgQVNGX0hDSV9VTlNVQ0NFU1MgfCAocEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlSW5kZXgvNCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgICAgIFNLX09VVDMyKCBJb0MsIEFTRl9IQ0lfQ01EUkVHLCBBU0ZfSENJX0NNRF9SRF9SRUFEWSApOwogICAgICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzID0gSENJX0VOX0NNRF9SRUFEWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBIQ0lfRU5fQ01EX1JFQURZOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIH0gIC8vICBzd2l0Y2goIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzICkgIHsKCiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5UbyA9IDA7CgogICAgfSAgLy8gIGlmICgoQ21kICYgKEFTRl9IQ0lfUkVBRCB8IEFTRl9IQ0lfV1JJVEUgfCBBU0ZfSENJX0NNRF9SRF9SRUFEWSB8IEFTRl9IQ0lfQ01EX1dSX1JFQURZKSkgPT0gMCkKICAgIGVsc2UgIHsKCiAgICAgICAgaWYoIFRvRW5hICkKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5UbysrOwogICAgICAgIC8qICBUaW1lb3V0ICEgKi8KICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkhjaS5UbyA+IEFTRl9IQ0lfVE8gKSAgewogICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyA9IEhDSV9FTl9DTURfRVJST1I7CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBUb0VuYSApICB7CiAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzICE9IEhDSV9FTl9DTURfSURMRSAmJgogICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyAhPSBIQ0lfRU5fQ01EX1JFQURZICYmCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzICE9IEhDSV9FTl9DTURfRVJST1IgKSB7CiAgICAgICAgICAgIFNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOwogICAgICAgICAgICBTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPkFzZkRhdGEuSGNpLkFzZlRpbWVySGNpLCAgLyogIDEwbXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwLCBTS0dFX0FTRiwgU0tfQVNGX0VWVF9USU1FUl9IQ0lfRVhQSVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UGFyYW0pOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZkhjaUdldERhdGEKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpTS19VOCBBc2ZIY2lHZXREYXRhKCBTS19BQyAgKnBBQywgU0tfVTggKipwSGNpUmVjQnVmICkgIHsKICAgICpwSGNpUmVjQnVmID0gcEFDLT5Bc2ZEYXRhLkhjaS5SZWNlaXZlQnVmOwogICAgcmV0dXJuKCAxICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmSGNpR2V0U3RhdGUKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpTS19VOCAgIEFzZkhjaUdldFN0YXRlKCBTS19BQyAqcEFDICkgIHsKICAgIFNLX1U4ICAgU3RhdDsKICAgIFNLX1U2NCAgRGlmZlRpbWU7CgogICAgU3RhdCA9IHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzOwogICAgaWYoIFN0YXQgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPSBIQ0lfRU5fQ01EX0lETEU7CiAgICAgICAgRGlmZlRpbWUgPSBTa09zR2V0VGltZShwQUMpIC0gcEFDLT5Bc2ZEYXRhLkhjaS5UaW1lOwovLyAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICoqKiBDeWNsZXM6JWQgVGltZTolbHVtc1xuIiwKLy8gICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5DeWNsZXMsIERpZmZUaW1lIC8gKDEwKjEwMDApICkpOwogICAgfQogICAgcmV0dXJuKCBTdGF0ICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEFzZkhjaVNlbmRDb21tYW5kCioKKiBEZXNjcmlwdGlvbjoKKgoqIFJldHVybnM6CioKKi8KU0tfVTggICBBc2ZIY2lTZW5kQ29tbWFuZCgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQywKU0tfVTggICBDb21tYW5kLApTS19VOCAgIFBhcjEsClNLX1U4ICAgUGFyMiwKU0tfVTggICBFeHBlY3RSZXNwb25zZSwKU0tfVTggICBXYWl0LApTS19VOCAgIFJldHJ5ICkgIHsKICAgIFNLX1U4ICAgUmV0Q29kZTsKICAgIFNLX1U4ICAgTWVzc2FnZVs0XTsKICAgIFNLX1U2NCAgU3RhcnRUaW1lOwogICAgU0tfVTY0ICBDdXJyVGltZTsKICAgIFNLX1U2NCAgVG1wVGltZTsKCiAgICBkbyB7CiAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzID09IEhDSV9FTl9DTURfSURMRSApICB7CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBTZW5kIENvbW1hbmQgY21kOjB4JXggcDE6MHgleCBwMjoweCV4IHdhaXQ6JWQgUmV0cnk6JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCwgUGFyMSwgUGFyMiwgV2FpdCwgUmV0cnkgKSk7CiAgICAgICAgICAgIE1lc3NhZ2VbMF0gPSBDb21tYW5kOwogICAgICAgICAgICBNZXNzYWdlWzFdID0gMjsgIC8vICBMZW5ndGgKICAgICAgICAgICAgTWVzc2FnZVsyXSA9IFBhcjE7CiAgICAgICAgICAgIE1lc3NhZ2VbM10gPSBQYXIyOwogICAgICAgICAgICBSZXRDb2RlID0gQXNmSGNpU2VuZE1lc3NhZ2UocEFDLCBJb0MsIE1lc3NhZ2UsIDQsIEV4cGVjdFJlc3BvbnNlLCBXYWl0ICk7CiAgICAgICAgfQoKICAgICAgICBpZiggV2FpdCApICB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CgogICAgICAgICAgICBUbXBUaW1lID0gU3RhcnRUaW1lICsgMTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgQ3VyclRpbWUgPSBTa09zR2V0VGltZShwQUMpOwogICAgICAgICAgICAgICAgaWYoIEN1cnJUaW1lID4gVG1wVGltZSApICB7CgkJICBTa0FzZkhjaSggcEFDLCBJb0MsIDAgKTsKCiAgICAgICAgICAgICAgICAgICAgVG1wVGltZSA9IEN1cnJUaW1lICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CgogICAgICAgICAgICAgICAgaWYgICggKEN1cnJUaW1lIC0gU3RhcnRUaW1lKSA+IChTS19USUNLU19QRVJfU0VDKjEpICkgewogICAgICAgICAgICAgICAgICAgIFJldENvZGUgPSBIQ0lfRU5fQ01EX0VSUk9SOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlKCAoUmV0Q29kZSAhPSBIQ0lfRU5fQ01EX1JFQURZKSAmJiAoUmV0Q29kZSAhPSBIQ0lfRU5fQ01EX0VSUk9SKSApOwoKICAgICAgICAgICAgaWYoIChSZXRDb2RlICE9IEhDSV9FTl9DTURfUkVBRFkpICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzID0gSENJX0VOX0NNRF9JRExFOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIENvbW1hbmQgbm90IGNvbmZpcm1lZCBSZXRDb2RlOjB4JXhcbiIsIFJldENvZGUgKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICAvLyAgaWYoIHdhaXQuLi4KICAgICAgICBlbHNlICB7CiAgICAgICAgICAgIFJldENvZGUgPSBBc2ZIY2lHZXRTdGF0ZSggcEFDICk7CiAgICAgICAgICAgIGlmKCAoUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SKSApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyA9IEhDSV9FTl9DTURfSURMRTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBDb21tYW5kIG5vdCBjb25maXJtZWQgUmV0Q29kZToweCV4XG4iLCBSZXRDb2RlICkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiggUmV0cnkgPiAwICkKICAgICAgICAgICAgUmV0cnktLTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwoKICAgIH0gd2hpbGUgKCBXYWl0ICYmIChSZXRDb2RlICE9IEhDSV9FTl9DTURfUkVBRFkpICk7CgogICAgaWYoIChSZXRDb2RlID09IEhDSV9FTl9DTURfUkVBRFkpICkgIHsKICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgQ29tbWFuZCBzdWNjZXNzZnVsbHkgY29udmV5ZWRcbiIpKTsKI2lmICgwKQoJaWYgKFdhaXQpCgkgIHByaW50aygiICAgIFRpbWUgcmVxdWlyZWQ6ICVsdVxuIiwgKEN1cnJUaW1lLVN0YXJ0VGltZSkpOwojZW5kaWYKICAgIH0KCiAgICByZXR1cm4oIFJldENvZGUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBBc2ZIY2lTZW5kRGF0YQoqCiogRGVzY3JpcHRpb246CioKKiBSZXR1cm5zOgoqCiovClNLX1U4ICAgQXNmSGNpU2VuZERhdGEoClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICAgKkJ1ZmZlciwKU0tfVTggICBFeHBlY3RSZXNwb25zZSwKU0tfVTggICBXYWl0LApTS19VOCAgIFJldHJ5ICkgIHsKICAgIFNLX1U4ICAgUmV0Q29kZTsKICAgIFNLX1U2NCAgU3RhcnRUaW1lOwogICAgU0tfVTY0ICBDdXJyVGltZTsKICAgIFNLX1U2NCAgVG1wVGltZTsKICAgIFNLX1U4ICAgTGVuZ3RoOwogICAgU0tfVTggICBDb21tYW5kOwoKICAgIGRvIHsKICAgICAgICBpZiggcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPT0gSENJX0VOX0NNRF9JRExFICkgIHsKICAgICAgICAgICAgQ29tbWFuZCA9ICooQnVmZmVyICsgMCApOwogICAgICAgICAgICBMZW5ndGggPSAgKihCdWZmZXIgKyAxKTsKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIFNlbmQgRGF0YSBjbWQ6MHgleCBMZW5ndGg6JWQgd2FpdDolZCBSZXRyeTolZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kLCBMZW5ndGgsIFdhaXQsIFJldHJ5ICkpOwogICAgICAgICAgICBSZXRDb2RlID0gQXNmSGNpU2VuZE1lc3NhZ2UocEFDLCBJb0MsIEJ1ZmZlciwgTGVuZ3RoLCBFeHBlY3RSZXNwb25zZSwgV2FpdCApOwogICAgICAgIH0KICAgICAgICBpZiggV2FpdCApICB7CiAgICAgICAgICAgIFN0YXJ0VGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CiAgICAgICAgICAgIFRtcFRpbWUgPSBTdGFydFRpbWUgKyAxOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBDdXJyVGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CiAgICAgICAgICAgICAgICBpZiggQ3VyclRpbWUgPiBUbXBUaW1lICkgIHsKICAgICAgICAgICAgICAgICAgICBTa0FzZkhjaSggcEFDLCBJb0MsIDAgKTsKICAgICAgICAgICAgICAgICAgICBUbXBUaW1lID0gQ3VyclRpbWUgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUmV0Q29kZSA9IEFzZkhjaUdldFN0YXRlKCBwQUMgKTsKICAgICAgICAgICAgICAgIGlmICggKEN1cnJUaW1lIC0gU3RhcnRUaW1lKSA+IChTS19USUNLU19QRVJfU0VDKjEpICkgIHsKICAgICAgICAgICAgICAgICAgICBSZXRDb2RlID0gSENJX0VOX0NNRF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoIChSZXRDb2RlID09IEhDSV9FTl9DTURfV1JJVElORykgfHwgKFJldENvZGUgPT0gSENJX0VOX0NNRF9XQUlUKSApOwoKICAgICAgICAgICAgaWYoIFJldENvZGUgIT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLlN0YXR1cyA9IEhDSV9FTl9DTURfSURMRTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBEYXRhIG5vdCBjb25maXJtZWQgUmV0Q29kZToweCV4XG4iLCBSZXRDb2RlICkpOwogICAgICAgICAgICB9CiAgICAgICAgfSAgLy8gIGlmKCB3YWl0Li4uCiAgICAgICAgZWxzZSAgewogICAgICAgICAgICBSZXRDb2RlID0gQXNmSGNpR2V0U3RhdGUoIHBBQyApOwogICAgICAgICAgICBpZiggUmV0Q29kZSA9PSBIQ0lfRU5fQ01EX0VSUk9SICkgIHsKICAgICAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU3RhdHVzID0gSENJX0VOX0NNRF9JRExFOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIERhdGEgbm90IGNvbmZpcm1lZCBSZXRDb2RlOjB4JXhcbiIsIFJldENvZGUgKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoIFJldHJ5ID4gMCApCiAgICAgICAgICAgIFJldHJ5LS07CiAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgIH0gd2hpbGUgKCBXYWl0ICYmIChSZXRDb2RlICE9IEhDSV9FTl9DTURfUkVBRFkpICk7CgogICAgaWYoIFJldENvZGUgPT0gSENJX0VOX0NNRF9SRUFEWSApICB7CiAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIERhdGEgc3VjY2Vzc2Z1bGx5IGNvbnZleWVkXG4iKSk7CiAgICB9CgogICAgcmV0dXJuKCBSZXRDb2RlICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmSGNpU2VuZE1lc3NhZ2UKKgoqIERlc2NyaXB0aW9uOgoqCiogUmV0dXJuczoKKgoqLwpTS19VOCAgICBBc2ZIY2lTZW5kTWVzc2FnZSgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQywKU0tfVTggICAqbWVzc2FnZSwKU0tfVTggICBsZW5ndGgsClNLX1U4ICAgRXhwZWN0UmVzcG9uc2UsClNLX1U4ICAgV2FpdCApICB7CiAgICBTS19VOCAgICAgICBSZXRDb2RlOwogICAgU0tfVTggICAgICAgaTsKICAgIFNLX0VWUEFSQSAgIEV2ZW50UGFyYW07CgogICAgUmV0Q29kZSA9IDA7CgogICAgaWYoIGxlbmd0aCA+IEFTRl9IQ0lfVFJBX0JVRl9TSVpFICkKICAgICAgICByZXR1cm4oIFJldENvZGUgKTsKCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPT0gSENJX0VOX0NNRF9JRExFICkKICAgIHsKICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgU2VuZCBNZXNzYWdlXG4iICkpOwoKICAgICAgICBTS19PVVQzMiggSW9DLCBBU0ZfSENJX0NNRFJFRywgKFNLX1UzMikgMCApOwogICAgICAgIFNLX09VVDMyKCBJb0MsIEFTRl9IQ0lfREFUQVJFRywgKFNLX1UzMikgMCApOwogICAgICAgIGZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5UcmFuc21pdEJ1ZltpXSA9IG1lc3NhZ2VbaV07CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TZW5kTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgIGlmKCBFeHBlY3RSZXNwb25zZSApCiAgICAgICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuRXhwZWN0UmVzcG9uc2UgPSAxOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5FeHBlY3RSZXNwb25zZSA9IDA7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5TdGF0dXMgPSBIQ0lfRU5fQ01EX1dSSVRJTkc7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5PbGRDbWRSZWcgPSAwOwogICAgICAgIHBBQy0+QXNmRGF0YS5IY2kuU2VuZEluZGV4ID0gMDsKICAgICAgICBwQUMtPkFzZkRhdGEuSGNpLkN5Y2xlcyA9IDA7CiAgICAgICAgcEFDLT5Bc2ZEYXRhLkhjaS5UaW1lID0gU2tPc0dldFRpbWUoIHBBQyApOwogICAgICAgIFJldENvZGUgPSAxOyAgLy8gIHN1Y2Nlc3NmdWxsCiAgICB9CiAgICBlbHNlCiAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIFNlbmQgTWVzc2FnZSAtPiBOb3QgSWRsZVxuIiApKTsKCgogICAgaWYoICFXYWl0ICkgIHsKICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgU2VuZCBNZXNzYWdlIC0+IFN0YXJ0IFRpbWVyXG4iICkpOwogICAgICAgIFNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOwogICAgICAgIFNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+QXNmRGF0YS5IY2kuQXNmVGltZXJIY2ksCiAgICAgICAgICAgICAgICAgICAgIDEwMDAwLCBTS0dFX0FTRiwgU0tfQVNGX0VWVF9USU1FUl9IQ0lfRVhQSVJFRCwKICAgICAgICAgICAgICAgICAgICAgRXZlbnRQYXJhbSk7CiAgICB9CgogICAgcmV0dXJuKCBSZXRDb2RlICk7Cn0KCgp2b2lkIEFzZldhdGNoQ3B1KApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VMzIgIHBhciApICB7CgojaWZkZWYgX1hYWF8KU0tfVTMyICBGd0FsaXZlLCBMYXN0RmV0Y2g7CgogICAgU0tfSU4zMiggSW9DLCBCMjhfWTJfREFUQV9SRUdfNCwgJkZ3QWxpdmUgKTsKICAgIFNLX0lOMzIoIElvQywgMHg2NCwgJkxhc3RGZXRjaCApOwogICAgaWYoIExhc3RGZXRjaCA8IDB4MjAwMDAgKQogICAgICAgIHBBQy0+QXNmRGF0YS5Gd0Vycm9yKys7CiAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIoJWQpIEFzZldhdGNoQ3B1OiBGd0FsaXZlOjB4JXggTGFzdEZldGNoOjB4JXggRXJyOiVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXIsIEZ3QWxpdmUgLCBMYXN0RmV0Y2gsIHBBQy0+QXNmRGF0YS5Gd0Vycm9yICkpOwojZW5kaWYgLy8gX1hYWF8KCiAgICByZXR1cm47Cn0KCgp2b2lkIEFzZkVuYWJsZSgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQyApICB7CiAgICBTS19VMzIgVG1wVmFsMzI7CgogICAgU0tfSU4zMihJb0MsIEIwX0NUU1QsICZUbXBWYWwzMik7CiAgICBUbXBWYWwzMiAmPSB+MHgwMDAwMzAwMDsgICAgLy8gY2xlYXIgYml0MTMsIGJpdDEyCiAgICBUbXBWYWwzMiB8PSAweDAwMDAyMDAwOyAgICAgICAgICAgICAvLyBzZXQgYml0MTMKICAgIFNLX09VVDMyKElvQywgQjBfQ1RTVCwgVG1wVmFsMzIpOwogICAgU0tfT1VUMzIoSW9DLCBCMF9DVFNULCBZMl9BU0ZfRU5BQkxFKTsKCiAgICBwQUMtPkdJbmkuR0lBc2ZFbmFibGVkID0gU0tfVFJVRTsgICAvLyB1cGRhdGUgYXNmIGZsYWcgZm9yIGNvbW1vbiBtb2R1bGVzCn0KCnZvaWQgQXNmRGlzYWJsZSgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQyApICB7CiAgICBTS19VMzIgVG1wVmFsMzI7CgogICAgU0tfSU4zMihJb0MsIEIwX0NUU1QsICZUbXBWYWwzMik7CiAgICBUbXBWYWwzMiAmPSB+MHgwMDAwMzAwMDsgICAgLy8gY2xlYXIgYml0MTMsIGJpdDEyCiAgICBUbXBWYWwzMiB8PSAweDAwMDAxMDAwOyAgICAgICAgICAgICAvLyBzZXQgYml0MTMKICAgIFNLX09VVDMyKElvQywgQjBfQ1RTVCwgVG1wVmFsMzIpOwogICAgU0tfT1VUMzIoSW9DLCBCMF9DVFNULCBZMl9BU0ZfRElTQUJMRSk7CgogICAgcEFDLT5HSW5pLkdJQXNmRW5hYmxlZCA9IFNLX0ZBTFNFOyAgLy8gdXBkYXRlIGFzZiBmbGFnIGZvciBjb21tb24gbW9kdWxlcwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmV3JpdGVJcG1pUGF0dGVybgoqCiogRGVzY3JpcHRpb246ICB3cml0ZSBhbGwgMyBwYXR0ZXJuIGZvciBJUE1JIHRvIHBhdHRlcm4gcmFtCioKKiBOb3RlczogICAgICAgIG5vbmUKKgoqIENvbnRleHQ6ICAgICAgbm9uZQoqCiogUmV0dXJuczogICAgICBZTENJX1NVQ0NFU1MKKiAgICAgICAgICAgICAgIFlMQ0lfRVJST1IKKgoqLwoKU0tfSTggQXNmV3JpdGVJcG1pUGF0dGVybigKICAgIFNLX0FDICAgKnBBQywKICAgIFNLX0lPQyAgSW9DLAogICAgU0tfVTggICBwb3J0KQp7CiAgICBTS19JOCAgIFJldFZhbDsKICAgIFNLX1U4ICAgaSwgajsKICAgIFNLX1UzMiAgaWR4OwogICAgU0tfVTMyICBQYXR0UmFtQ2x1c3RlcltBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9XT1JEU107CiAgICBTS19VOCAgIFBhdHRTcmNCeXRlWzJdOyAgICAgLy8gMiBwYXR0ZXJuIGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gb25lIGNsdXN0ZXIKICAgIFNLX1UzMiAgVG1wVmFsMzI7CiAgICBTS19VMzIgIG1hc2s7CiAgICBTS19VOCAgIHBhdHRlcm5fbm87CgogICAgUmV0VmFsID0gMTsgICAgIC8vIHN1Y2Nlc3MKCiAgICBpZiAoUmV0VmFsID09IDEpIHsKCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9TSVpFKSAmJiAoUmV0VmFsID09IDEpOyBpKyspIHsKICAgICAgICAgICAgLy8gcGF0dGVybiByYW0gaXMgb3JnYW5pemVkIGludG8gY2x1c3RlciAoaSBpcyBjbHVzdGVyIGluZGV4KQogICAgICAgICAgICAvLyBfYWZ0ZXJfIHdyaXRpbmcgYSB3aG9sZSBjbHVzdGVyICg9IDEyOGJpdCksIHRoZSBwYXR0ZXJuIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHJhbSEKCiAgICAgICAgICAgIC8vIHJlYWQgYSBjbHVzdGVyCiAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFM7IGorKykgewogICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbal0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIHJlYWQgc291cmNlIHBhdHRlcm4gNgogICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIHBhdHRlcm5fbm8gPSA2OwogICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDI7IGorKykgewogICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSAyIHBhdHRlcm4gYnl0ZXMgdG8gcmVhZC93cml0ZSBmb3Igb25lIGNsdXN0ZXIKICAgICAgICAgICAgICAgIC8vIGkgaXMgY2x1c3RlciBpbmRleAogICAgICAgICAgICAgICAgLy8gaiBpcyBieXRlIGluZGV4CiAgICAgICAgICAgICAgICBpZHggPSAyKmkrajsKICAgICAgICAgICAgICAgIGlmIChpZHggPCA0MCkgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiByZWFkIGZyb20gb3VyIHBhdHRlcm4gcG9pbnRlcgogICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gUk1DUF9GUkFNRV9QQVRURVJOW2lkeF07CgogICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBvdXIgZW5hYmxlIG1hc2sgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgIFRtcFZhbDMyID0gUk1DUF9QQVRURVJOX01BU0tbaWR4LzhdOwogICAgICAgICAgICAgICAgICAgIG1hc2sgICAgID0gMHgwMSA8PCAoaWR4ICUgOCk7CgogICAgICAgICAgICAgICAgICAgIGlmICggKFRtcFZhbDMyICYgbWFzaykgIT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdIHw9IChCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdICY9IH4oQklUXzI0IDw8IHBhdHRlcm5fbm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvcwogICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltqKjIrMV0gJj0gfihCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwcGVyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCiAgICAgICAgICAgIGlkeCA9IDE7CgogICAgICAgICAgICAvLyBmaXJzdCBieXRlCiAgICAgICAgICAgIG1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBqICAgID0gcGF0dGVybl9ubyAlIDQ7CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gJj0gfihtYXNrIDw8IDggKiBqKTsgICAgLy8gZGVsZXRlIGJ5dGUgaW4gd29yZAogICAgICAgICAgICBtYXNrID0gUGF0dFNyY0J5dGVbMF07CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gfD0gKG1hc2sgPDwgOCAqIGopOyAgICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCgogICAgICAgICAgICAvLyBzZWNvbmQgYnl0ZQogICAgICAgICAgICBtYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdICY9IH4obWFzayA8PCA4ICogaik7ICAvLyBkZWxldGUgYnl0ZSBpbiB3b3JkCiAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZVsxXTsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdIHw9IChtYXNrIDw8IDggKiBqKTsgICAvLyB3cml0ZSBwYXR0ZXJuIGJ5dGUKCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgLy8gcmVhZCBzb3VyY2UgcGF0dGVybiA1CiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgcGF0dGVybl9ubyA9IDU7CiAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMjsgaisrKSB7CiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIDIgcGF0dGVybiBieXRlcyB0byByZWFkL3dyaXRlIGZvciBvbmUgY2x1c3RlcgogICAgICAgICAgICAgICAgLy8gaSBpcyBjbHVzdGVyIGluZGV4CiAgICAgICAgICAgICAgICAvLyBqIGlzIGJ5dGUgaW5kZXgKICAgICAgICAgICAgICAgIGlkeCA9IDIqaStqOwogICAgICAgICAgICAgICAgaWYgKGlkeCA8IDQwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYWQgZnJvbSBvdXIgcGF0dGVybiBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgUGF0dFNyY0J5dGVbal0gPSBBUlBfRlJBTUVfUEFUVEVSTltpZHhdOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGZyb20gb3VyIGVuYWJsZSBtYXNrIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICBUbXBWYWwzMiA9IEFSUF9QQVRURVJOX01BU0tbaWR4LzhdOwogICAgICAgICAgICAgICAgICAgIG1hc2sgICAgID0gMHgwMSA8PCAoaWR4ICUgOCk7CgogICAgICAgICAgICAgICAgICAgIGlmICggKFRtcFZhbDMyICYgbWFzaykgIT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdIHw9IChCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdICY9IH4oQklUXzI0IDw8IHBhdHRlcm5fbm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvcwogICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltqKjIrMV0gJj0gfihCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwcGVyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCiAgICAgICAgICAgIGlkeCA9IDE7CgogICAgICAgICAgICAvLyBmaXJzdCBieXRlCiAgICAgICAgICAgIG1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBqICAgID0gcGF0dGVybl9ubyAlIDQ7CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gJj0gfihtYXNrIDw8IDggKiBqKTsgICAgLy8gZGVsZXRlIGJ5dGUgaW4gd29yZAogICAgICAgICAgICBtYXNrID0gUGF0dFNyY0J5dGVbMF07CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gfD0gKG1hc2sgPDwgOCAqIGopOyAgICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCgogICAgICAgICAgICAvLyBzZWNvbmQgYnl0ZQogICAgICAgICAgICBtYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdICY9IH4obWFzayA8PCA4ICogaik7ICAvLyBkZWxldGUgYnl0ZSBpbiB3b3JkCiAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZVsxXTsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdIHw9IChtYXNrIDw8IDggKiBqKTsgICAvLyB3cml0ZSBwYXR0ZXJuIGJ5dGUKCiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgLy8gcmVhZCBzb3VyY2UgcGF0dGVybiA0CiAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgcGF0dGVybl9ubyA9IDQ7CiAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMjsgaisrKSB7CiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIDIgcGF0dGVybiBieXRlcyB0byByZWFkL3dyaXRlIGZvciBvbmUgY2x1c3RlcgogICAgICAgICAgICAgICAgLy8gaSBpcyBjbHVzdGVyIGluZGV4CiAgICAgICAgICAgICAgICAvLyBqIGlzIGJ5dGUgaW5kZXgKICAgICAgICAgICAgICAgIGlkeCA9IDIqaStqOwogICAgICAgICAgICAgICAgaWYgKGlkeCA8IDQwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYWQgZnJvbSBvdXIgcGF0dGVybiBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgUGF0dFNyY0J5dGVbal0gPSBSU1BfRlJBTUVfUEFUVEVSTltpZHhdOwoKICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGZyb20gb3VyIGVuYWJsZSBtYXNrIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICBUbXBWYWwzMiA9IFJTUF9QQVRURVJOX01BU0tbaWR4LzhdOwogICAgICAgICAgICAgICAgICAgIG1hc2sgICAgID0gMHgwMSA8PCAoaWR4ICUgOCk7CgogICAgICAgICAgICAgICAgICAgIGlmICggKFRtcFZhbDMyICYgbWFzaykgIT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdIHw9IChCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaioyKzFdICY9IH4oQklUXzI0IDw8IHBhdHRlcm5fbm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgdXAgd2l0aCB6ZXJvcwogICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gMDsKICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIGJ5dGUKICAgICAgICAgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltqKjIrMV0gJj0gfihCSVRfMjQgPDwgcGF0dGVybl9ubyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHVwcGVyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCiAgICAgICAgICAgIGlkeCA9IDE7CgogICAgICAgICAgICAvLyBmaXJzdCBieXRlCiAgICAgICAgICAgIG1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBqICAgID0gcGF0dGVybl9ubyAlIDQ7CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gJj0gfihtYXNrIDw8IDggKiBqKTsgICAgLy8gZGVsZXRlIGJ5dGUgaW4gd29yZAogICAgICAgICAgICBtYXNrID0gUGF0dFNyY0J5dGVbMF07CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gfD0gKG1hc2sgPDwgOCAqIGopOyAgICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCgogICAgICAgICAgICAvLyBzZWNvbmQgYnl0ZQogICAgICAgICAgICBtYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdICY9IH4obWFzayA8PCA4ICogaik7ICAvLyBkZWxldGUgYnl0ZSBpbiB3b3JkCiAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZVsxXTsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdIHw9IChtYXNrIDw8IDggKiBqKTsgICAvLyB3cml0ZSBwYXR0ZXJuIGJ5dGUKCiAgICAgICAgICAgIC8vIHdyaXRlIGEgY2x1c3RlcgogICAgICAgICAgICAvLyBhZnRlciB3cml0aW5nIHRoZSBsYXN0IGNsdXN0ZXIgd29yZCwgdGhlIGhhcmR3YXJlIHdpbGwgdHJpZ2dlciB3cml0aW5nIGFsbCBjbHVzdGVyIHdvcmRzCiAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFM7IGorKykgewogICAgICAgICAgICAgICAgaWR4ID0gQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFMqQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfQllURVMqaSArIEFTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX0JZVEVTKmo7CgogICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApICB7CgkJICAgIFNLX09VVDMyKCBJb0MsIFdPTF9QQVRUX1JBTV8xK2lkeCwgUGF0dFJhbUNsdXN0ZXJbal0gKTsKCQl9CiAgICAgICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgV09MX1BBVFRfUkFNXzIraWR4LCBQYXR0UmFtQ2x1c3RlcltqXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoUmV0VmFsKTsKfQoKdm9pZCBBc2ZTZXRVcFBhdHRlcm4oClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICAgcG9ydCApICB7CgogICAgU0tfVTggICBUbXBWYWw4OwogICAgU0tfVTE2ICBUbXBWYWwxNjsKICAgIFNLX1UzMiAgVG1wVmFsMzI7CgogICAgaWYoIHBvcnQgPiAxICkKICAgICAgICByZXR1cm47CgogICAgc3dpdGNoIChwQUMtPkFzZkRhdGEuT3BNb2RlKSB7CiAgICAgICAgY2FzZSBTS19HRUFTRl9NT0RFX0FTRjoKICAgICAgICAgICAgLy8gc2VlICJwcm9ibGVtcy50eHQiIG5vdGUgIzM0NAogICAgICAgICAgICAvLyBzZXQgTUFDIFJ4IGZpZm8gZmx1c2ggdGhyZXNob2xkIHJlZ2lzdGVyCiAgICAgICAgICAgIC8vIChwbGVhc2UgcmVmZXIgYWxzbyB0byBub3RlICN5dWtfaHcwMSkKICAgICAgICAgICAgU0tfSU4zMihJb0MsIEFTRl9ZRUNfTUFDX0ZJRk9fRkxVU0hUSFJFUzErKHBvcnQqMHg4MCksICZUbXBWYWwzMik7CiAgICAgICAgICAgIFRtcFZhbDMyICY9IH4weDdmOyAgLy8gZGVsZXRlIGJpdCA2OjAKICAgICAgICAgICAgVG1wVmFsMzIgfD0gQVNGX1lMQ0lfTUFDUlhGSUZPVEhSRVM7CiAgICAgICAgICAgIFNLX09VVDMyKElvQywgQVNGX1lFQ19NQUNfRklGT19GTFVTSFRIUkVTMSsocG9ydCoweDgwKSwgVG1wVmFsMzIpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSBXYWtlIFVwIEZyYW1lIFVuaXQgYmVmb3JlIHdyaXRlIHRvIHBhdHRlcm4gcmFtCiAgICAgICAgICAgIFNLX0lOMTYoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fQ1RSTDErKHBvcnQqMHg4MCksICZUbXBWYWwxNik7CiAgICAgICAgICAgIFRtcFZhbDE2ICY9IH4weDAzOyAgIC8vIGNsZWFyIGJpdCAwLCBiaXQxCiAgICAgICAgICAgIFRtcFZhbDE2IHw9ICAweDAxOyAgIC8vIHNldCBiaXQgMAogICAgICAgICAgICBTS19PVVQxNihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9DVFJMMSsocG9ydCoweDgwKSwgVG1wVmFsMTYpOwoKICAgICAgICAgICAgLy8gIFNldCBuZXcgcGF0dGVybiBmb3IgQVNGCiAgICAgICAgICAgIC8vICBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIGRyaXZlciBXT0wgcGF0dGVybiwgYnV0IHRoZSBkcml2ZXIgaXMgZ29pbmcgdG8gc2V0CiAgICAgICAgICAgIC8vICB0aGUgV09MIHBhdHRlcm4gYWdhaW4gYmVmb3JlIGl0ICJzaHV0IGRvd24iIG9yICJzdGFuZCBieSIKICAgICAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5NaWIuUnNwRW5hYmxlICkgIHsKICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5IGlzIG9uIC0gd3JpdGUgQVJQIGFuZCBSU1AgcGF0dGVybgogICAgICAgICAgICAgICAgQXNmV3JpdGVQYXR0ZXJuUmFtKHBBQywgSW9DLCBwb3J0LCA1LCA2LCA0MCwgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJQX1BBVFRFUk5fTUFTSywgQVJQX0ZSQU1FX1BBVFRFUk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNQX1BBVFRFUk5fTUFTSywgUlNQX0ZSQU1FX1BBVFRFUk4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5IGlzIG9mZiAtIHdyaXRlIEFSUCBhbmQgUk1DUCBwYXR0ZXJuCiAgICAgICAgICAgICAgICBBc2ZXcml0ZVBhdHRlcm5SYW0ocEFDLCBJb0MsIHBvcnQsIDUsIDYsIDQwLCA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlBfUEFUVEVSTl9NQVNLLCBBUlBfRlJBTUVfUEFUVEVSTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTUNQX1BBVFRFUk5fTUFTSywgUk1DUF9GUkFNRV9QQVRURVJOKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IHBhdHRlcm4gbGVuZ3RoIHJlZ2lzdGVyCiAgICAgICAgICAgIFNLX0lOMzIoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fTEVOR1RIX1IxX0grKHBvcnQqMHg4MCksICZUbXBWYWwzMik7CiAgICAgICAgICAgIFRtcFZhbDMyICY9IH4oMHgwMDAwMDA3ZiA8PCA4Kig1JTQpKTsKICAgICAgICAgICAgVG1wVmFsMzIgfD0gKDQwLTEpIDw8IDgqKDUlNCk7ICAgICAvLyB3cml0ZSBsZW5ndGgtMSB0byBwYXR0ZXJuIGxlbmd0aCByZWdpc3RlcgogICAgICAgICAgICBTS19PVVQzMihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9MRU5HVEhfUjFfSCsocG9ydCoweDgwKSwgVG1wVmFsMzIpOwogICAgICAgICAgICAvLyBzZXQgcGF0dGVybiBsZW5ndGggcmVnaXN0ZXIKICAgICAgICAgICAgU0tfSU4zMihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9MRU5HVEhfUjFfSCsocG9ydCoweDgwKSwgJlRtcFZhbDMyKTsKICAgICAgICAgICAgVG1wVmFsMzIgJj0gfigweDAwMDAwMDdmIDw8IDgqKDYlNCkpOwogICAgICAgICAgICBUbXBWYWwzMiB8PSAoNDAtMSkgPDwgOCooNiU0KTsgICAgIC8vIHdyaXRlIGxlbmd0aC0xIHRvIHBhdHRlcm4gbGVuZ3RoIHJlZ2lzdGVyCiAgICAgICAgICAgIFNLX09VVDMyKElvQywgQVNGX1lFQ19QQVRURVJOX0xFTkdUSF9SMV9IKyhwb3J0KjB4ODApLCBUbXBWYWwzMik7CgogICAgICAgICAgICAvLyBzZXQgQVNGIG1hdGNoIGVuYWJsZSByZWdpc3RlciAoaW5jb21taW5nIHBhY2tldHMgd2lsbCByZWRpcmVjdCB0byBBU0YgcXVldWUpCiAgICAgICAgICAgIFNLX0lOOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9NQVRDSEVOQTErKHBvcnQqMHg4MCksICZUbXBWYWw4KTsKICAgICAgICAgICAgVG1wVmFsOCB8PSAweDQwOyAgICAvLyBwYXR0ZXJuIDYgZW5hYmxlCiAgICAgICAgICAgIFNLX09VVDgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fTUFUQ0hFTkExKyhwb3J0KjB4ODApLCBUbXBWYWw4KTsKCiAgICAgICAgICAgIC8vIGVuYWJsZSBwYXR0ZXJuIHBhdHRubwogICAgICAgICAgICBTS19JTjgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fRU5BMSsocG9ydCoweDgwKSwgJlRtcFZhbDgpOwogICAgICAgICAgICBUbXBWYWw4IHw9IDB4NDA7ICAgIC8vIHBhdHRlcm4gNiBlbmFibGUKICAgICAgICAgICAgU0tfT1VUOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9FTkExKyhwb3J0KjB4ODApLCBUbXBWYWw4KTsKCiAgICAgICAgICAgIC8vIGVuYWJsZSBXYWtlIFVwIEZyYW1lIFVuaXQKICAgICAgICAgICAgU0tfSU4xNihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9DVFJMMSsocG9ydCoweDgwKSwgJlRtcFZhbDE2KTsKICAgICAgICAgICAgVG1wVmFsMTYgJj0gfjB4MDM7ICAgLy8gZGVsZXRlIGJpdCAwIGFuZCAxCiAgICAgICAgICAgIFRtcFZhbDE2IHw9IDB4MDI7ICAgLy8gc2V0IGJpdCAxCiAgICAgICAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFQ19QQVRURVJOX0NUUkwxKyhwb3J0KjB4ODApLCBUbXBWYWwxNik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU0tfR0VBU0ZfTU9ERV9JUE1JOgogICAgICAgICAgICAvLyBkaXNhYmxlIFdha2UgVXAgRnJhbWUgVW5pdCBiZWZvcmUgd3JpdGUgdG8gcGF0dGVybiByYW0KICAgICAgICAgICAgU0tfSU4xNihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9DVFJMMSsocG9ydCoweDgwKSwgJlRtcFZhbDE2KTsKICAgICAgICAgICAgVG1wVmFsMTYgJj0gfjB4MDM7ICAgLy8gY2xlYXIgYml0IDAsIGJpdDEKICAgICAgICAgICAgVG1wVmFsMTYgfD0gMHgwMTsgICAvLyBzZXQgYml0IDAKICAgICAgICAgICAgU0tfT1VUMTYoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fQ1RSTDErKHBvcnQqMHg4MCksIFRtcFZhbDE2KTsKCiAgICAgICAgICAgIC8vIHdyaXRlIGFsbCAzIHBhdHRlcm4gKFJNQ1AsIFJTUCBhbmQgQVJQKQogICAgICAgICAgICBBc2ZXcml0ZUlwbWlQYXR0ZXJuKHBBQywgSW9DLCBwb3J0KTsKCiAgICAgICAgICAgIC8vIHNldCBwYXR0ZXJuIGxlbmd0aCByZWdpc3RlcgogICAgICAgICAgICBTS19JTjMyKElvQywgQVNGX1lFQ19QQVRURVJOX0xFTkdUSF9SMV9IKyhwb3J0KjB4ODApLCAmVG1wVmFsMzIpOwogICAgICAgICAgICBUbXBWYWwzMiAmPSAweGZmMDAwMDAwOyAgICAgLy8gZGVsZXRlIGxlbmd0aCBmb3IgcGF0dGVybiA0LCA1IGFuZCA2CiAgICAgICAgICAgIFRtcFZhbDMyIHw9IDB4MDAyNzI3Mjc7ICAgICAvLyBzZXQgbmV3IGxlbmd0aCBmb3IgcGF0dGVybiA0LCA1IGFuZCA2CiAgICAgICAgICAgIFNLX09VVDMyKElvQywgQVNGX1lFQ19QQVRURVJOX0xFTkdUSF9SMV9IKyhwb3J0KjB4ODApLCBUbXBWYWwzMik7CgogICAgICAgICAgICAvLyBzZXQgQVNGIG1hdGNoIGVuYWJsZSByZWdpc3RlciAoaW5jb21taW5nIHBhY2tldHMgd2lsbCByZWRpcmVjdCB0byBBU0YgcXVldWUpCiAgICAgICAgICAgIFNLX0lOOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9NQVRDSEVOQTErKHBvcnQqMHg4MCksICZUbXBWYWw4KTsKICAgICAgICAgICAgVG1wVmFsOCA9IDB4NTA7ICAgIC8vIGVuYWJsZSBwYXR0ZXJuIDQgYW5kIDYgKGRvIG5vdCBlbmFibGUgYXJwIHBhdHRlcm4pCiAgICAgICAgICAgIFNLX09VVDgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fTUFUQ0hFTkExKyhwb3J0KjB4ODApLCBUbXBWYWw4KTsKCiAgICAgICAgICAgIC8vIGVuYWJsZSBwYXR0ZXJuIHBhdHRubwogICAgICAgICAgICBTS19JTjgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fRU5BMSsocG9ydCoweDgwKSwgJlRtcFZhbDgpOwogICAgICAgICAgICBUbXBWYWw4ID0gMHg1MDsgICAgLy8gZW5hYmxlIHBhdHRlcm4gNCBhbmQgNiAoZG8gbm90IGVuYWJsZSBhcnAgcGF0dGVybikKICAgICAgICAgICAgU0tfT1VUOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9FTkExKyhwb3J0KjB4ODApLCBUbXBWYWw4KTsKCiAgICAgICAgICAgIC8vIGVuYWJsZSBXYWtlIFVwIEZyYW1lIFVuaXQKICAgICAgICAgICAgU0tfSU4xNihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9DVFJMMSsocG9ydCoweDgwKSwgJlRtcFZhbDE2KTsKICAgICAgICAgICAgVG1wVmFsMTYgJj0gfjB4MDM7ICAgLy8gZGVsZXRlIGJpdCAwIGFuZCAxCiAgICAgICAgICAgIFRtcFZhbDE2IHw9IDB4MDI7ICAgLy8gc2V0IGJpdCAxCiAgICAgICAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFQ19QQVRURVJOX0NUUkwxKyhwb3J0KjB4ODApLCBUbXBWYWwxNik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFNLX0dFQVNGX01PREVfREFTSDoKCSAgICAvLyAgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIFl1a29uIEV4dHJlbWUKCSAgICBpZiggcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlICE9IFNLX0dFQVNGX0NISVBfRVggKQoJICAgICAgYnJlYWs7CgkJCQogICAgICAgICAgICAvLyBkaXNhYmxlIFdha2UgVXAgRnJhbWUgVW5pdCBiZWZvcmUgd3JpdGUgdG8gcGF0dGVybiByYW0KICAgICAgICAgICAgU0tfSU4xNihJb0MsIEFTRl9ZRUNfUEFUVEVSTl9DVFJMMSsocG9ydCoweDgwKSwgJlRtcFZhbDE2KTsKICAgICAgICAgICAgVG1wVmFsMTYgJj0gfjB4MDM7ICAgLy8gY2xlYXIgYml0IDAsIGJpdDEKICAgICAgICAgICAgVG1wVmFsMTYgfD0gIDB4MDE7ICAgLy8gc2V0IGJpdCAwCiAgICAgICAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFQ19QQVRURVJOX0NUUkwxKyhwb3J0KjB4ODApLCBUbXBWYWwxNik7CgogICAgICAgICAgICAvLyB3cml0ZSBhbGwgMyBwYXR0ZXJuIAoJICAgIEFzZldyaXRlUGF0dGVyblJhbUV4KHBBQywgSW9DLCBwb3J0LCBBU0ZfREFTSF9QQVRURVJOX05VTV9BUlAsICA0MCwgQVJQX1BBVFRFUk5fTUFTSywgQVJQX0ZSQU1FX1BBVFRFUk4gKTsKCSAgICBBc2ZXcml0ZVBhdHRlcm5SYW1FeChwQUMsIElvQywgcG9ydCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fSUNNUCwgNDAsIElDTVBfUEFUVEVSTl9NQVNLLCBJQ01QX0ZSQU1FX1BBVFRFUk4gKTsKCSAgICBBc2ZXcml0ZVBhdHRlcm5SYW1FeChwQUMsIElvQywgcG9ydCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fU05NUCwgNDAsIFNOTVBfUEFUVEVSTl9NQVNLLCBTTk1QX0ZSQU1FX1BBVFRFUk4gKTsKCSAgICAvL0FzZldyaXRlUGF0dGVyblJhbUV4KHBBQywgSW9DLCBwb3J0LCBBU0ZfREFTSF9QQVRURVJOX05VTV9STUNQLCA0MCwgUk1DUF9QQVRURVJOX01BU0ssIFJNQ1BfRlJBTUVfUEFUVEVSTiApOwoJICAgIC8vQXNmV3JpdGVQYXR0ZXJuUmFtRXgocEFDLCBJb0MsIHBvcnQsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1JTUCwgIDQwLCBSU1BfUEFUVEVSTl9NQVNLLCBSU1BfRlJBTUVfUEFUVEVSTiApOwoJICAgIC8vQXNmV3JpdGVQYXR0ZXJuUmFtRXgocEFDLCBJb0MsIHBvcnQsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1RDUDEsIDQwLCBUQ1BfUEFUVEVSTl9NQVNLLCBUQ1BfRlJBTUVfUEFUVEVSTiApOwoJICAgIC8vQXNmV3JpdGVQYXR0ZXJuUmFtRXgocEFDLCBJb0MsIHBvcnQsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1RDUDIsIDQwLCBUQ1BfUEFUVEVSTl9NQVNLLCBUQ1BfRlJBTUVfUEFUVEVSTiApOwoJICAgIAoJICAgIC8vWWxjaUVuYWJsZVBhdHRlcm4oIHBBQywgSW9DLCBwb3J0LCBBU0ZfREFTSF9QQVRURVJOX05VTV9STUNQICk7CQkKCSAgICAvL1lsY2lFbmFibGVQYXR0ZXJuKCBwQUMsIElvQywgcG9ydCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fUlNQICk7CQkKCSAgICAvL1lsY2lFbmFibGVQYXR0ZXJuKCBwQUMsIElvQywgcG9ydCwgQVNGX0RBU0hfUEFUVEVSTl9OVU1fVENQMSApOwkJCgkgICAgLy9ZbGNpRW5hYmxlUGF0dGVybiggcEFDLCBJb0MsIHBvcnQsIEFTRl9EQVNIX1BBVFRFUk5fTlVNX1RDUDIgKTsJCQoJCQkKICAgICAgICAgICAgLy8gZW5hYmxlIFdha2UgVXAgRnJhbWUgVW5pdAogICAgICAgICAgICBTS19JTjE2KElvQywgQVNGX1lFQ19QQVRURVJOX0NUUkwxKyhwb3J0KjB4ODApLCAmVG1wVmFsMTYpOwogICAgICAgICAgICBUbXBWYWwxNiAmPSB+MHgwMzsgICAvLyBkZWxldGUgYml0IDAgYW5kIDEKICAgICAgICAgICAgVG1wVmFsMTYgfD0gIDB4MDI7ICAgLy8gc2V0IGJpdCAxCiAgICAgICAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFQ19QQVRURVJOX0NUUkwxKyhwb3J0KjB4ODApLCBUbXBWYWwxNik7CiAgICAgICAgICAgIGJyZWFrOwoJCQkKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogQXNmV3JpdGVQYXR0ZXJuUmFtCioKKiBEZXNjcmlwdGlvbjogIHdyaXRlIHRvIHBhdHRlcm4gcmFtCioKKiBOb3RlczogICAgICAgIG5vbmUKKgoqIENvbnRleHQ6ICAgICAgbm9uZQoqCiogUmV0dXJuczogICAgICAxOiAgU1VDQ0VTUwoqICAgICAgICAgICAgICAgMDogIFlMQ0lfRVJST1IKKgoqLwoKU0tfSTggQXNmV3JpdGVQYXR0ZXJuUmFtKApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VOCAgIFBvcnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgZnV0dXJlIHVzZSAgICovClNLX1U4ICAgUGF0dGVybklkMSwgICAgICAgICAgICAgICAgICAvKiAwLi42ICAgICAgICAgICAgICovClNLX1U4ICAgUGF0dGVybklkMiwgICAgICAgICAgICAgICAgICAvKiAwLi42ICAgICAgICAgICAgICovClNLX1U4ICAgTGVuZ3RoMSwgICAgICAgICAgICAgICAgICAgICAvKiAxLi4xMjggYnl0ZXMgICAgICovClNLX1U4ICAgTGVuZ3RoMiwgICAgICAgICAgICAgICAgICAgICAvKiAxLi4xMjggYnl0ZXMgICAgICovClNLX1U4ICAgKnBNYXNrMSwKU0tfVTggICAqcFBhdHRlcm4xLApTS19VOCAgICpwTWFzazIsClNLX1U4ICAgKnBQYXR0ZXJuMikKCnsKICAgIFNLX1U4ICAgaSwgajsKICAgIFNLX0k4ICAgUmV0VmFsOwogICAgU0tfVTMyICBpZHg7CiAgICBTS19VMzIgIFBhdHRSYW1DbHVzdGVyW0FTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX1dPUkRTXTsKICAgIFNLX1U4ICAgUGF0dFNyY0J5dGUxWzJdOyAgICAgLy8gMiBwYXR0ZXJuIGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gb25lIGNsdXN0ZXIKICAgIFNLX1U4ICAgUGF0dFNyY0J5dGUyWzJdOyAgICAgLy8gMiBwYXR0ZXJuIGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gb25lIGNsdXN0ZXIKICAgIFNLX1UzMiAgVG1wVmFsMzI7CiAgICBTS19VMzIgIG1hc2s7CgogICAgUmV0VmFsID0gMTsgIC8vICBzdWNjZXNzCgogICAgLy8gcGF0dGVybiBzaXplIHVwIHRvIDEyOCBieXRlcywgcGF0dGVybiBpZCBjYW4gYmUgMC4uLjYKICAgIGlmICggKExlbmd0aDEgPD0gU0tfUE9XX1BBVFRFUk5fTEVOR1RIKSAmJiAoUGF0dGVybklkMSA8IFNLX05VTV9XT0xfUEFUVEVSTikgKSB7CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfU0laRSkgJiYgKFJldFZhbCA9PSAxKTsgaSsrKSB7CiAgICAgICAgICAgIC8vIHBhdHRlcm4gcmFtIGlzIG9yZ2FuaXplZCBpbnRvIGNsdXN0ZXIgKGkgaXMgY2x1c3RlciBpbmRleCkKICAgICAgICAgICAgLy8gX2FmdGVyXyB3cml0aW5nIGEgd2hvbGUgY2x1c3RlciAoPSAxMjhiaXQpLCB0aGUgcGF0dGVybiB3aWxsIGJlIHdyaXR0ZW4gaW50byByYW0hCgogICAgICAgICAgICAvLyByZWFkIGEgY2x1c3RlcgogICAgICAgICAgICBmb3IgKGo9MDsgaiA8IEFTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX1dPUkRTOyBqKyspIHsKICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2pdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyByZWFkIHNvdXJjZSBwYXR0ZXJuIDEKICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyOyBqKyspIHsKICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgMiBwYXR0ZXJuIGJ5dGVzIHRvIHJlYWQvd3JpdGUgZm9yIG9uZSBjbHVzdGVyCiAgICAgICAgICAgICAgICAvLyBpIGlzIGNsdXN0ZXIgaW5kZXgKICAgICAgICAgICAgICAgIC8vIGogaXMgYnl0ZSBpbmRleAogICAgICAgICAgICAgICAgaWR4ID0gMippK2o7CiAgICAgICAgICAgICAgICBpZiAoIGlkeCA8IExlbmd0aDEgKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYWQgZnJvbSBvdXIgcGF0dGVybiBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgUGF0dFNyY0J5dGUxW2pdID0gcFBhdHRlcm4xW2lkeF07CgogICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBvdXIgZW5hYmxlIG1hc2sgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgIFRtcFZhbDMyID0gcE1hc2sxW2lkeC84XTsKICAgICAgICAgICAgICAgICAgICBtYXNrICAgICA9IDB4MDEgPDwgKGlkeCAlIDgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIChUbXBWYWwzMiAmIG1hc2spICE9IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBieXRlCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSB8PSAoQklUXzI0IDw8IFBhdHRlcm5JZDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBieXRlCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSAmPSB+KEJJVF8yNCA8PCBQYXR0ZXJuSWQxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIHVwIHdpdGggemVyb3MKICAgICAgICAgICAgICAgICAgICBQYXR0U3JjQnl0ZTFbal0gPSAwOwogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgYnl0ZQogICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSAmPSB+KEJJVF8yNCA8PCBQYXR0ZXJuSWQxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyByZWFkIHNvdXJjZSBwYXR0ZXJuIDIKICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyOyBqKyspIHsKICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgMiBwYXR0ZXJuIGJ5dGVzIHRvIHJlYWQvd3JpdGUgZm9yIG9uZSBjbHVzdGVyCiAgICAgICAgICAgICAgICAvLyBpIGlzIGNsdXN0ZXIgaW5kZXgKICAgICAgICAgICAgICAgIC8vIGogaXMgYnl0ZSBpbmRleAogICAgICAgICAgICAgICAgaWR4ID0gMippK2o7CiAgICAgICAgICAgICAgICBpZiAoIGlkeCA8IExlbmd0aDIgKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYWQgZnJvbSBvdXIgcGF0dGVybiBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgUGF0dFNyY0J5dGUyW2pdID0gcFBhdHRlcm4yW2lkeF07CgogICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBvdXIgZW5hYmxlIG1hc2sgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgIFRtcFZhbDMyID0gcE1hc2syW2lkeC84XTsKICAgICAgICAgICAgICAgICAgICBtYXNrICAgICA9IDB4MDEgPDwgKGlkeCAlIDgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIChUbXBWYWwzMiAmIG1hc2spICE9IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBieXRlCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSB8PSAoQklUXzI0IDw8IFBhdHRlcm5JZDIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBieXRlCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSAmPSB+KEJJVF8yNCA8PCBQYXR0ZXJuSWQyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBmaWxsIHVwIHdpdGggemVyb3MKICAgICAgICAgICAgICAgICAgICBQYXR0U3JjQnl0ZTJbal0gPSAwOwogICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgYnl0ZQogICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSAmPSB+KEJJVF8yNCA8PCBQYXR0ZXJuSWQyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBzZXQgb3VyIHBhdHRlcm4gaW50byBQYXR0UmFtQ2x1c3RlcltdCiAgICAgICAgICAgIGlmIChQYXR0ZXJuSWQxID49IDQpIHsKICAgICAgICAgICAgICAgIC8vIHVwcGVyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCiAgICAgICAgICAgICAgICBpZHggPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gbG93ZXIgd29yZHMgYXJlIGludGVyZXN0aW5nIGhlcmUKICAgICAgICAgICAgICAgIGlkeCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZmlyc3QgYnl0ZQogICAgICAgICAgICBtYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgaiAgICA9IFBhdHRlcm5JZDEgJSA0OwogICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltpZHhdICY9IH4obWFzayA8PCA4ICogaik7ICAgIC8vIGRlbGV0ZSBieXRlIGluIHdvcmQKICAgICAgICAgICAgbWFzayA9IFBhdHRTcmNCeXRlMVswXTsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4XSB8PSAobWFzayA8PCA4ICogaik7ICAgICAvLyB3cml0ZSBwYXR0ZXJuIGJ5dGUKICAgICAgICAgICAgLy8gc2Vjb25kIGJ5dGUKICAgICAgICAgICAgbWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeCsyXSAmPSB+KG1hc2sgPDwgOCAqIGopOyAgLy8gZGVsZXRlIGJ5dGUgaW4gd29yZAogICAgICAgICAgICBtYXNrID0gUGF0dFNyY0J5dGUxWzFdOwogICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltpZHgrMl0gfD0gKG1hc2sgPDwgOCAqIGopOyAgIC8vIHdyaXRlIHBhdHRlcm4gYnl0ZQoKICAgICAgICAgICAgLy8gc2V0IG91ciBwYXR0ZXJuIGludG8gUGF0dFJhbUNsdXN0ZXJbXQogICAgICAgICAgICBpZiAoUGF0dGVybklkMiA+PSA0KSB7CiAgICAgICAgICAgICAgICAvLyB1cHBlciB3b3JkcyBhcmUgaW50ZXJlc3RpbmcgaGVyZQogICAgICAgICAgICAgICAgaWR4ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGxvd2VyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCiAgICAgICAgICAgICAgICBpZHggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGZpcnN0IGJ5dGUKICAgICAgICAgICAgbWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIGogICAgPSBQYXR0ZXJuSWQyICUgNDsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4XSAmPSB+KG1hc2sgPDwgOCAqIGopOyAgICAvLyBkZWxldGUgYnl0ZSBpbiB3b3JkCiAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZTJbMF07CiAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gfD0gKG1hc2sgPDwgOCAqIGopOyAgICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCiAgICAgICAgICAgIC8vIHNlY29uZCBieXRlCiAgICAgICAgICAgIG1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltpZHgrMl0gJj0gfihtYXNrIDw8IDggKiBqKTsgIC8vIGRlbGV0ZSBieXRlIGluIHdvcmQKICAgICAgICAgICAgbWFzayA9IFBhdHRTcmNCeXRlMlsxXTsKICAgICAgICAgICAgUGF0dFJhbUNsdXN0ZXJbaWR4KzJdIHw9IChtYXNrIDw8IDggKiBqKTsgICAvLyB3cml0ZSBwYXR0ZXJuIGJ5dGUKCiAgICAgICAgICAgIC8vIHdyaXRlIGEgY2x1c3RlcgogICAgICAgICAgICAvLyBhZnRlciB3cml0aW5nIHRoZSBsYXN0IGNsdXN0ZXIgd29yZCwgdGhlIGhhcmR3YXJlIHdpbGwgdHJpZ2dlciB3cml0aW5nIGFsbCBjbHVzdGVyIHdvcmRzCiAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFM7IGorKykgewogICAgICAgICAgICAgICAgaWR4ID0gQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFMqQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfQllURVMqaSArIEFTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX0JZVEVTKmo7CiAgICAgICAgICAgICAgICBpZiggUG9ydCA9PSAwICkgIHsKICAgICAgICAgICAgICAgICAgICBTS19PVVQzMiggSW9DLCBXT0xfUEFUVF9SQU1fMStpZHgsIFBhdHRSYW1DbHVzdGVyW2pdICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlICB7CiAgICAgICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgV09MX1BBVFRfUkFNXzIraWR4LCBQYXR0UmFtQ2x1c3RlcltqXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgUmV0VmFsID0gMDsgIC8vICBlcnJvcgogICAgfQoKICAgIHJldHVybihSZXRWYWwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFlsY2lXcml0ZVBhdHRlcm5SYW1FeAoqCiogRGVzY3JpcHRpb246ICB3cml0ZSB0byBwYXR0ZXJuIHJhbQoqCiogTm90ZXM6ICAgICAgICBub25lCioKKiBDb250ZXh0OiAgICAgIG5vbmUKKgoqIFJldHVybnM6ICAgICAgMTogIFNVQ0NFU1MKKiAgICAgICAgICAgICAgIDA6ICBZTENJX0VSUk9SCioKKi8KCi8vICNpZmRlZiBDSElQX0lEX1lVS09OX0VYCQkKU0tfSTggQXNmV3JpdGVQYXR0ZXJuUmFtRXgoClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICAgUG9ydCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgZnV0dXJlIHVzZSAgICovClNLX1U4ICAgUGF0dGVybklkICwgICAgICAgICAgICAgICAgICAvKiAwLi45ICAgICAgICAgICAgICovClNLX1U4ICAgTGVuZ3RoICwgICAgICAgICAgICAgICAgICAgICAvKiAxLi4xMjggYnl0ZXMgICAgICovClNLX1U4ICAgKnBNYXNrICwKU0tfVTggICAqcFBhdHRlcm4gKQoKewogICAgU0tfVTggICBpLCBqOwogICAgU0tfSTggICBSZXRWYWw7CiAgICBTS19VMzIgIGlkeDsKICAgIFNLX1UzMiAgUGF0dFJhbUNsdXN0ZXJbQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFNdOwogICAgU0tfVTggICBQYXR0U3JjQnl0ZVsyXTsgICAgIC8vIDIgcGF0dGVybiBieXRlcyB0byByZWFkL3dyaXRlIGluIG9uZSBjbHVzdGVyCiAgICBTS19VMzIgIFRtcFZhbDMyOwogICAgU0tfVTMyICBtYXNrOwoJU0tfVTggICBUbXBQYXR0ZXJuSWQ7CglTS19VOAliYW5rOwoJU0tfVTE2ICBBc2ZZZXhQYXR0ZXJuTGVuZ3RoUmVnOwoJCiAgICBSZXRWYWwgPSAxOyAgLy8gIHN1Y2Nlc3MKCiAgICAvLyBwYXR0ZXJuIHNpemUgdXAgdG8gMTI4IGJ5dGVzLCBwYXR0ZXJuIGlkIGNhbiBiZSAwLi4uNgogICAgaWYgKCBMZW5ndGggPD0gU0tfUE9XX1BBVFRFUk5fTEVOR1RIICkgewogICAgCWlmICggUGF0dGVybklkIDwgU0tfTlVNX1dPTF9QQVRURVJOX0VYICkgewoJCQkKCQkJaWYoIFBhdHRlcm5JZCA8IFNLX05VTV9XT0xfUEFUVEVSTiApICB7CgkJCQlUbXBQYXR0ZXJuSWQgPSBQYXR0ZXJuSWQ7CgkJCQliYW5rID0gMDsKCQkJfQoJCQllbHNlICB7CgkJCQlUbXBQYXR0ZXJuSWQgPSBQYXR0ZXJuSWQgLSBTS19OVU1fV09MX1BBVFRFUk47CgkJCQliYW5rID0gMTsKCQkJfQoKCQkJLy8gIHNlbGVjdCBwYXR0ZXJuIGJhbmsKICAgICAgICAgICAgU0tfSU4zMiggSW9DLCBQQVRfQ1NSLCAmVG1wVmFsMzIgKTsKCQkJaWYoIGJhbmsgPT0gMCApCgkJCQlUbXBWYWwzMiAmPSB+KFBBVF9DU1JfQlNFTCk7CgkJCWVsc2UKCQkJCVRtcFZhbDMyIHw9IFBBVF9DU1JfQlNFTDsKICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgUEFUX0NTUiwgVG1wVmFsMzIgKTsKCQkJCgkgICAgICAgIGZvciAoaSA9IDA7IChpIDwgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfU0laRSkgJiYgKFJldFZhbCA9PSAxKTsgaSsrKSB7CgkgICAgICAgICAgICAvLyBwYXR0ZXJuIHJhbSBpcyBvcmdhbml6ZWQgaW50byBjbHVzdGVyIChpIGlzIGNsdXN0ZXIgaW5kZXgpCgkgICAgICAgICAgICAvLyBfYWZ0ZXJfIHdyaXRpbmcgYSB3aG9sZSBjbHVzdGVyICg9IDEyOGJpdCksIHRoZSBwYXR0ZXJuIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHJhbSEKCgkgICAgICAgICAgICAvLyByZWFkIGEgY2x1c3RlcgoJICAgICAgICAgICAgZm9yIChqPTA7IGogPCBBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9XT1JEUzsgaisrKSB7CgkgICAgICAgICAgICAgICAgaWR4ID0gQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfV09SRFMqQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfQllURVMqaSArIEFTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX0JZVEVTKmo7CgkgICAgICAgICAgICAgICAgaWYoIFBvcnQgPT0gMCApICB7CgkgICAgICAgICAgICAgICAgICAgIFNLX0lOMzIoIElvQywgV09MX1BBVFRfUkFNXzEraWR4LCAmUGF0dFJhbUNsdXN0ZXJbal0gKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgZWxzZSAgewoJICAgICAgICAgICAgICAgICAgICBTS19JTjMyKCBJb0MsIFdPTF9QQVRUX1JBTV8yK2lkeCwgJlBhdHRSYW1DbHVzdGVyW2pdICk7CgkgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgLy8gcmVhZCBzb3VyY2UgcGF0dGVybiAKCSAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMjsgaisrKSB7CgkgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSAyIHBhdHRlcm4gYnl0ZXMgdG8gcmVhZC93cml0ZSBmb3Igb25lIGNsdXN0ZXIKCSAgICAgICAgICAgICAgICAvLyBpIGlzIGNsdXN0ZXIgaW5kZXgKCSAgICAgICAgICAgICAgICAvLyBqIGlzIGJ5dGUgaW5kZXgKCSAgICAgICAgICAgICAgICBpZHggPSAyKmkrajsKCSAgICAgICAgICAgICAgICBpZiAoIGlkeCA8IExlbmd0aCApIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlYWQgZnJvbSBvdXIgcGF0dGVybiBwb2ludGVyCgkgICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gcFBhdHRlcm5baWR4XTsKCgkgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBvdXIgZW5hYmxlIG1hc2sgcG9pbnRlcgoJICAgICAgICAgICAgICAgICAgICBUbXBWYWwzMiA9IHBNYXNrW2lkeC84XTsKCSAgICAgICAgICAgICAgICAgICAgbWFzayAgICAgPSAweDAxIDw8IChpZHggJSA4KTsKCgkgICAgICAgICAgICAgICAgICAgIGlmICggKFRtcFZhbDMyICYgbWFzaykgIT0gMCApIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBieXRlCgkgICAgICAgICAgICAgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltqKjIrMV0gfD0gKEJJVF8yNCA8PCBUbXBQYXR0ZXJuSWQpOwoJICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBieXRlCgkgICAgICAgICAgICAgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltqKjIrMV0gJj0gfihCSVRfMjQgPDwgVG1wUGF0dGVybklkKTsKCSAgICAgICAgICAgICAgICAgICAgfQoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCB1cCB3aXRoIHplcm9zCgkgICAgICAgICAgICAgICAgICAgIFBhdHRTcmNCeXRlW2pdID0gMDsKCSAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBieXRlCgkgICAgICAgICAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2oqMisxXSAmPSB+KEJJVF8yNCA8PCBUbXBQYXR0ZXJuSWQpOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIC8vIHNldCBvdXIgcGF0dGVybiBpbnRvIFBhdHRSYW1DbHVzdGVyW10KCSAgICAgICAgICAgIGlmIChUbXBQYXR0ZXJuSWQgPj0gNCkgewoJICAgICAgICAgICAgICAgIC8vIHVwcGVyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCgkgICAgICAgICAgICAgICAgaWR4ID0gMTsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGVsc2UgewoJICAgICAgICAgICAgICAgIC8vIGxvd2VyIHdvcmRzIGFyZSBpbnRlcmVzdGluZyBoZXJlCgkgICAgICAgICAgICAgICAgaWR4ID0gMDsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIC8vIGZpcnN0IGJ5dGUKCSAgICAgICAgICAgIG1hc2sgPSAweDAwMDAwMGZmOwoJICAgICAgICAgICAgaiAgICA9IFRtcFBhdHRlcm5JZCAlIDQ7CgkgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltpZHhdICY9IH4obWFzayA8PCA4ICogaik7ICAgIC8vIGRlbGV0ZSBieXRlIGluIHdvcmQKCSAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZVswXTsKCSAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeF0gfD0gKG1hc2sgPDwgOCAqIGopOyAgICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCgkgICAgICAgICAgICAvLyBzZWNvbmQgYnl0ZQoJICAgICAgICAgICAgbWFzayA9IDB4MDAwMDAwZmY7CgkgICAgICAgICAgICBQYXR0UmFtQ2x1c3RlcltpZHgrMl0gJj0gfihtYXNrIDw8IDggKiBqKTsgIC8vIGRlbGV0ZSBieXRlIGluIHdvcmQKCSAgICAgICAgICAgIG1hc2sgPSBQYXR0U3JjQnl0ZVsxXTsKCSAgICAgICAgICAgIFBhdHRSYW1DbHVzdGVyW2lkeCsyXSB8PSAobWFzayA8PCA4ICogaik7ICAgLy8gd3JpdGUgcGF0dGVybiBieXRlCgoJICAgICAgICAgICAgLy8gd3JpdGUgYSBjbHVzdGVyCgkgICAgICAgICAgICAvLyBhZnRlciB3cml0aW5nIHRoZSBsYXN0IGNsdXN0ZXIgd29yZCwgdGhlIGhhcmR3YXJlIHdpbGwgdHJpZ2dlciB3cml0aW5nIGFsbCBjbHVzdGVyIHdvcmRzCgkgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IEFTRl9ZRUNfUEFUVFJBTV9DTFVTVEVSX1dPUkRTOyBqKyspIHsKCSAgICAgICAgICAgICAgICBpZHggPSBBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9XT1JEUypBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9CWVRFUyppICsgQVNGX1lFQ19QQVRUUkFNX0NMVVNURVJfQllURVMqajsKCSAgICAgICAgICAgICAgICBpZiggUG9ydCA9PSAwICkgIHsKCSAgICAgICAgICAgICAgICAgICAgU0tfT1VUMzIoIElvQywgV09MX1BBVFRfUkFNXzEraWR4LCBQYXR0UmFtQ2x1c3RlcltqXSApOwoJICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICBlbHNlICB7CgkgICAgICAgICAgICAgICAgICAgIFNLX09VVDMyKCBJb0MsIFdPTF9QQVRUX1JBTV8yK2lkeCwgUGF0dFJhbUNsdXN0ZXJbal0gKTsKCSAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICB9CgkgICAgICAgIH0gIC8vICAJZm9yIChpID0gMDsgKGkgPCBBU0ZfWUVDX1BBVFRSQU1fQ0xVU1RFUl9TSVpFKSAmJiAoUmV0VmFsID09IDEpOyBpKyspCgkgICAgICAgIAoJCQkvLyAgU2V0IHBhdHRlcm4gbGVuZ3RoIHJlZ2lzdGVyCgkJCUFzZllleFBhdHRlcm5MZW5ndGhSZWcgPSBBU0ZfWUVYX1BBVFRFUk5fTEVOR1RIX1IxX0wrKFBvcnQqMHg4MCkrKCAoUGF0dGVybklkLzQpKnNpemVvZihTS19VMzIpICk7CgkJICAgIFNLX0lOMzIoSW9DLCBBc2ZZZXhQYXR0ZXJuTGVuZ3RoUmVnLCAmVG1wVmFsMzIpOwkJCgkJICAgIFRtcFZhbDMyICY9IH4oMHgwMDAwMDA3ZiA8PCA4KihQYXR0ZXJuSWQlNCkpOwkJCQoJCSAgICBUbXBWYWwzMiB8PSAoTGVuZ3RoLTEpIDw8IDgqKFBhdHRlcm5JZCU0KTsgICAgIC8vIHdyaXRlIGxlbmd0aC0xIHRvIHBhdHRlcm4gbGVuZ3RoIHJlZ2lzdGVyCgkJICAgIFNLX09VVDMyKElvQywgQXNmWWV4UGF0dGVybkxlbmd0aFJlZywgVG1wVmFsMzIpOwoJCQkKICAgIAl9ICAvLyAgaWYgKCBQYXR0ZXJuSWQgPCBTS19OVU1fV09MX1BBVFRFUk5fRVggKSAKCQllbHNlICB7CgkgICAgICAgIFJldFZhbCA9IDA7ICAvLyAgZXJyb3IKCQl9CiAgICB9ICAvLyAgIGlmICggTGVuZ3RoMSA8PSBTS19QT1dfUEFUVEVSTl9MRU5HVEggKQogICAgZWxzZSB7CiAgICAgICAgUmV0VmFsID0gMDsgIC8vICBlcnJvcgogICAgfQogICAgcmV0dXJuKFJldFZhbCk7Cn0KLy8gI2VuZGlmIC8vICBDSElQX0lEX1lVS09OX0VYCQoKU0tfSTggWWxjaUVuYWJsZVBhdHRlcm4gKApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VOCAgIHBvcnQsClNLX1U4ICAgcGF0dG5vICkKewoKCiAgICBpZiAocG9ydCA+IDEpIHsKICAgICAgICByZXR1cm4gKDEpOwogICAgfQogICAgCiAgICBpZiggcEFDLT5Bc2ZEYXRhLkNoaXBNb2RlID09IFNLX0dFQVNGX0NISVBfRVggKSAgewogICAgICBTS19VMTYgICB2YWwxNjsKICAgICAgCiAgICAgIGlmKCBwQUMtPkFzZkRhdGEuT3BNb2RlICE9IFNLX0dFQVNGX01PREVfREFTSCApCglwYXR0bm8gKz0gNjsKICAgICAgCiAgICAgIC8vIHNldCBBU0YgbWF0Y2ggZW5hYmxlIHJlZ2lzdGVyIChpbmNvbW1pbmcgcGFja2V0cyB3aWxsIHJlZGlyZWN0IHRvIEFTRiBxdWV1ZSkKICAgICAgU0tfSU4xNihJb0MsIEFTRl9ZRVhfUEFUVEVSTl9NQVRDSEVOQTErKHBvcnQqMHg4MCksICZ2YWwxNik7CiAgICAgIHZhbDE2IHw9ICgweDAxIDw8IHBhdHRubyk7CiAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFWF9QQVRURVJOX01BVENIRU5BMSsocG9ydCoweDgwKSwgdmFsMTYpOwogICAgICAKICAgICAgLy8gZW5hYmxlIHBhdHRlcm4gcGF0dG5vCiAgICAgIFNLX0lOMTYoSW9DLCBBU0ZfWUVYX1BBVFRFUk5fRU5BMSsocG9ydCoweDgwKSwgJnZhbDE2KTsKICAgICAgdmFsMTYgfD0gKDB4MDEgPDwgcGF0dG5vKTsKICAgICAgU0tfT1VUMTYoSW9DLCBBU0ZfWUVYX1BBVFRFUk5fRU5BMSsocG9ydCoweDgwKSwgdmFsMTYpOwogICAgfQogICAgZWxzZSAgewogICAgICBTS19VOCAgIHZhbDg7CiAgICAgIHBhdHRubyArPSA0OwogICAgICAvLyBzZXQgQVNGIG1hdGNoIGVuYWJsZSByZWdpc3RlciAoaW5jb21taW5nIHBhY2tldHMgd2lsbCByZWRpcmVjdCB0byBBU0YgcXVldWUpCiAgICAgIFNLX0lOOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9NQVRDSEVOQTErKHBvcnQqMHg4MCksICZ2YWw4KTsKICAgICAgdmFsOCB8PSAoMHgwMSA8PCBwYXR0bm8pOwogICAgICBTS19PVVQ4KElvQywgQVNGX1lFQ19QQVRURVJOX01BVENIRU5BMSsocG9ydCoweDgwKSwgdmFsOCk7CiAgICAgIAogICAgICAvLyBlbmFibGUgcGF0dGVybiBwYXR0bm8KICAgICAgU0tfSU44KElvQywgQVNGX1lFQ19QQVRURVJOX0VOQTErKHBvcnQqMHg4MCksICZ2YWw4KTsKICAgICAgdmFsOCB8PSAoMHgwMSA8PCBwYXR0bm8pOwogICAgICBTS19PVVQ4KElvQywgQVNGX1lFQ19QQVRURVJOX0VOQTErKHBvcnQqMHg4MCksIHZhbDgpOwogICAgfQoKICAgIHJldHVybiAoIDEgKTsKfQoKLy8gQ2FsbGVkIFlsY2lEaXNhYmxlUGF0dGVyblR5cGUgaW4gV2luZG93cyBDb2RlClNLX0k4IFlsY2lEaXNhYmxlUGF0dGVybiAoClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICAgcG9ydCwKU0tfVTggICBwYXR0bm8gKQp7CiAgICBpZiAocG9ydCA+IDEpIHsKICAgICAgICByZXR1cm4gKDEpOwogICAgfQogICAgaWYoIHBBQy0+QXNmRGF0YS5DaGlwTW9kZSA9PSBTS19HRUFTRl9DSElQX0VYICkgIHsKICAgICAgU0tfVTE2ICAgdmFsMTY7CiAgICAgIAogICAgICBpZiggcEFDLT5Bc2ZEYXRhLk9wTW9kZSAhPSBTS19HRUFTRl9NT0RFX0RBU0ggKQoJcGF0dG5vICs9IDY7CiAgICAgIAogICAgICAvLyBzZXQgQVNGIG1hdGNoIGRpc2FibGUgcmVnaXN0ZXIgKGluY29tbWluZyBwYWNrZXRzIHdpbGwgcmVkaXJlY3QgdG8gQVNGIHF1ZXVlKQogICAgICBTS19JTjE2KElvQywgQVNGX1lFWF9QQVRURVJOX01BVENIRU5BMSsocG9ydCoweDgwKSwgJnZhbDE2KTsKICAgICAgdmFsMTYgJj0gfigweDAxIDw8IHBhdHRubyk7CiAgICAgIFNLX09VVDE2KElvQywgQVNGX1lFWF9QQVRURVJOX01BVENIRU5BMSsocG9ydCoweDgwKSwgdmFsMTYpOwogICAgICAKICAgICAgLy8gZGlzYWJsZSBwYXR0ZXJuIHBhdHRubwogICAgICBTS19JTjE2KElvQywgQVNGX1lFWF9QQVRURVJOX0VOQTErKHBvcnQqMHg4MCksICZ2YWwxNik7CgkgICAgdmFsMTYgJj0gfigweDAxIDw8IHBhdHRubyk7CgkgICAgU0tfT1VUMTYoSW9DLCBBU0ZfWUVYX1BBVFRFUk5fRU5BMSsocG9ydCoweDgwKSwgdmFsMTYpOwogICAgfQogICAgZWxzZSAgewogICAgICBTS19VOCAgIHZhbDg7CiAgICAgIHBhdHRubyArPSA0OwogICAgICAvLyBzZXQgQVNGIG1hdGNoIGRpc2FibGUgcmVnaXN0ZXIgKGluY29tbWluZyBwYWNrZXRzIHdpbGwgcmVkaXJlY3QgdG8gQVNGIHF1ZXVlKQogICAgICBTS19JTjgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fTUFUQ0hFTkExKyhwb3J0KjB4ODApLCAmdmFsOCk7CiAgICAgIHZhbDggJj0gfigweDAxIDw8IHBhdHRubyk7CiAgICAgIFNLX09VVDgoSW9DLCBBU0ZfWUVDX1BBVFRFUk5fTUFUQ0hFTkExKyhwb3J0KjB4ODApLCB2YWw4KTsKICAgICAgCiAgICAgIC8vIGRpc2FibGUgcGF0dGVybiBwYXR0bm8KICAgICAgU0tfSU44KElvQywgQVNGX1lFQ19QQVRURVJOX0VOQTErKHBvcnQqMHg4MCksICZ2YWw4KTsKICAgICAgdmFsOCAmPSB+KDB4MDEgPDwgcGF0dG5vKTsKICAgICAgU0tfT1VUOChJb0MsIEFTRl9ZRUNfUEFUVEVSTl9FTkExKyhwb3J0KjB4ODApLCB2YWw4KTsKICAgIH0JCiAgICByZXR1cm4gKCAxICk7Cn0KCiNpZiAoMCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZBY3BpCioKKiBEZXNjcmlwdGlvbjogIFNlYXJjaGVzIGZvciB0aGUgUm9vdCBTeXN0ZW0gRGVzY3JpcHRpb24gUG9pbnRlciAiUlNEIFBUUiIKKiAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgMHhFMDAwMCAuLiAweEZGRkZGIChBQ1BJIFNwZWMgNS4yLjQuMSkuCiogICAgICAgICAgICAgICBUaGUgIlJTRCBQVFIiIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgQUNQSSBkYXRhIGJhc2UuIEl0CiogICAgICAgICAgICAgICBjb250YWlucyBwb2ludGVyIHRvIHRoZSAiUlNEVCIgKDMyYml0KSBhbmQgIlhTRFQiICg2NGJpdCkKKiAgICAgICAgICAgICAgIHRhYmxlcywgd2hpY2ggaW4gdHVybiBjb250YWluIGxpc3RzIG9mIHBvaW50ZXJzIHRoYXQgYXJlCiogICAgICAgICAgICAgICBwb2ludGluZyB0byBBQ1BJIHN1YiB0YWJsZXMgZS5nLiAiQVNGISIgLgoqCiogTm90ZXM6ICAgICAgICBub25lCioKKiBDb250ZXh0OiAgICAgIG5vbmUKKgoqIFJldHVybnM6ICAgICAgIDE6IE9LCiogICAgICAgICAgICAgICAgMDogVU5ERUZJTkVECiogICAgICAgICAgICAgICA8MDogRXJyb3IgQ29kZXMKKgoqLwpTS19JOCBTa0FzZkFjcGkoClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICpwSW1hZ2UgKSAgewogICAgSEFORExFICAgICAgICAgICAgICBTZWN0aW9uSGFuZGxlOwogICAgTlRTVEFUVVMgICAgICAgICAgICBOdFJldDsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKnBVODsKICAgIFBWT0lEICAgICAgICAgICAgICAgQmFzZUFkZHJlc3M7CiAgICBVTE9ORyAgICAgICAgICAgICAgIENvbW1pdFNpemU7CiAgICBVTE9ORyAgICAgICAgICAgICAgIGk7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIE1heFNpemU7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIFNlY3RPZmZzZXQ7CiAgICBTSVpFX1QgICAgICAgICAgICAgIFZpZXdTaXplOwogICAgU0tfVTMyICAgICAgICAgICAgICBSc2R0QWRkcjsKICAgIFNLX1U2NCAgICAgICAgICAgICAgWHNkdEFkZHI7CiAgICBTS19JOCAgICAgICAgICAgICAgIEFjcGlTdGF0ZTsKICAgIFNLX0k4ICAgICAgICAgICAgICAgUmV0VmFsOwogICAgVU5JQ09ERV9TVFJJTkcgICAgICBTZWN0aW9uTmFtZTsKICAgIE9CSkVDVF9BVFRSSUJVVEVTICAgT2JqQXR0cnM7CgogICAgV0NIQVIgICAgICAgICAgICAgICBjb25zdCBTZWN0aW9uTmFtZUNvbnN0W10gPSBMIlxcRGV2aWNlXFxQaHlzaWNhbE1lbW9yeSI7CgogICAgUnNkdEFkZHIgPSAwOwogICAgQWNwaVN0YXRlID0gQVNGX0FDUElfU1RBVEVfT0s7CgogICAgLy8gIEluaXRpYWxpemUgb2JqZWN0IGF0dHJpYnV0ZXMKICAgIFNlY3Rpb25OYW1lLkJ1ZmZlciA9ICAgICAgICAoUFdTVFIpJlNlY3Rpb25OYW1lQ29uc3RbMF07CiAgICBTZWN0aW9uTmFtZS5MZW5ndGggPSAgICAgICAgd2NzbGVuKFNlY3Rpb25OYW1lQ29uc3QpICogc2l6ZW9mKFdDSEFSKTsKICAgIFNlY3Rpb25OYW1lLk1heGltdW1MZW5ndGggPSBTZWN0aW9uTmFtZS5MZW5ndGggKyBzaXplb2YoV0NIQVIpOwoKI2lmIE5ESVNfVkVSU0lPTiA+IDUwCiAgICAvLyBXaW5YUAogICAgSW5pdGlhbGl6ZU9iamVjdEF0dHJpYnV0ZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT2JqQXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VjdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT0JKX0tFUk5FTF9IQU5ETEUgfCBPQkpfRk9SQ0VfQUNDRVNTX0NIRUNLKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIQU5ETEUpTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU0VDVVJJVFlfREVTQ1JJUFRPUilOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiNlbHNlCiAgICAvLyBXaW4yawogICAgSW5pdGlhbGl6ZU9iamVjdEF0dHJpYnV0ZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmT2JqQXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VjdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT0JKX0tFUk5FTF9IQU5ETEUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhBTkRMRSlOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTRUNVUklUWV9ERVNDUklQVE9SKU5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKI2VuZGlmCgogICAgLy8gIEdldCBhIFNlY3Rpb25IYW5kbGUgdG8gdGhlICJcXERldmljZVxcUGh5c2ljYWxNZW1vcnkiIHNlY3Rpb24KICAgIE50UmV0ID0gWndPcGVuU2VjdGlvbiggJlNlY3Rpb25IYW5kbGUsICAgICAgLy8gIE9VVCBQSEFORExFICBTZWN0aW9uSGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fTUFQX1JFQUQsICAgIC8vICBJTiBBQ0NFU1NfTUFTSyAgRGVzaXJlZEFjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJk9iakF0dHJzICk7ICAgICAgICAgLy8gIElOIFBPQkpFQ1RfQVRUUklCVVRFUyAgT2JqZWN0QXR0cmlidXRlcwoKICAgIGlmKCBOdFJldCA9PSBTVEFUVVNfU1VDQ0VTUyApICB7CiAgICAgICAgQmFzZUFkZHJlc3MgPSBOVUxMOwogICAgICAgIFNlY3RPZmZzZXQuUXVhZFBhcnQgPSAgIDB4ZTAwMDA7CiAgICAgICAgQ29tbWl0U2l6ZSA9ICAgICAgICAgICAgMHgxZmZmZjsKICAgICAgICBWaWV3U2l6ZSA9ICAgICAgICAgICAgICAweDFmZmZmOwogICAgICAgIE50UmV0ID0gWndNYXBWaWV3T2ZTZWN0aW9uKCBTZWN0aW9uSGFuZGxlLCAgICAgICAgICAvLyBJTiBIQU5ETEUgIFNlY3Rpb25IYW5kbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnRDdXJyZW50UHJvY2VzcygpLCAgICAgLy8gSU4gSEFORExFICBQcm9jZXNzSGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCYXNlQWRkcmVzcywgICAgICAgICAgIC8vIElOIE9VVCBQVk9JRCAgKkJhc2VBZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLCAgICAgICAgICAgICAgICAgICAgIC8vIElOIFVMT05HICBaZXJvQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21taXRTaXplLCAgICAgICAgICAgICAvLyBJTiBVTE9ORyAgQ29tbWl0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNlY3RPZmZzZXQsICAgICAgICAgICAgLy8gSU4gT1VUIFBMQVJHRV9JTlRFR0VSICBTZWN0aW9uT2Zmc2V0ICBPUFRJT05BTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZpZXdTaXplLCAgICAgICAgICAgICAgLy8gSU4gT1VUIFBTSVpFX1QgIFZpZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3U2hhcmUsICAgICAgICAgICAgICAvLyBJTiBTRUNUSU9OX0lOSEVSSVQgIEluaGVyaXREaXNwb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gSU4gVUxPTkcgIEFsbG9jYXRpb25UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURPTkxZICAgICAgICAgICAvLyBJTiBVTE9ORyAgUHJvdGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIGlmKCBOdFJldCA9PSBTVEFUVVNfU1VDQ0VTUyApICB7CiAgICAgICAgICAgIC8vICBVcGRhdGUgQVNGISB0YWJsZQogICAgICAgICAgICAvLyAgU2VhcmNoIGZvciB0aGUgIlJTRCBQVFIiIHNpZ25hdHVyZQogICAgICAgICAgICBwVTggPSAoKHVuc2lnbmVkIGNoYXIgKikgQmFzZUFkZHJlc3MpOwogICAgICAgICAgICBmb3IoIGk9MDsgaTwoMHgxZmZmZi03KTsgaSsrICkgewogICAgICAgICAgICAgICAgaWYoICgqKHBVOCArIDAgKSA9PSAnUicpICYmICgqKHBVOCArIDEgKSA9PSAnUycpICYmICgqKHBVOCArIDIgKSA9PSAnRCcpICYmICgqKHBVOCArIDMgKSA9PSAnICcpICYmCiAgICAgICAgICAgICAgICAgICAgKCoocFU4ICsgNCApID09ICdQJykgJiYgKCoocFU4ICsgNSApID09ICdUJykgJiYgKCoocFU4ICsgNiApID09ICdSJykgICAgKSAgewogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmQWNwaSAtPiBSU0QgUFRSIGZvdW5kIGF0IDB4JXggKHBoeXMpXG4iLCAweGUwMDAwK2kgKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gIEdldCBBZGRyZXNzIG9mIHRoZSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAiUlNEVCIKICAgICAgICAgICAgICAgICAgICBSc2R0QWRkciA9ICooIChTS19VMzIgKikocFU4ICsgMTYpICk7CiAgICAgICAgICAgICAgICAgICAgaWYoIFJzZHRBZGRyICE9IDAgKSAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAgMzJiaXQgcGxhdGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZBY3BpIC0+IFJTRFQgKDB4JXgpXG4iLCBSc2R0QWRkcikpOwogICAgICAgICAgICAgICAgICAgICAgICBSZXRWYWwgPSBTa0FzZkFjcGlSc2R0KCBwQUMsIElvQywgcEltYWdlLCBTZWN0aW9uSGFuZGxlLCBSc2R0QWRkciApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiggUmV0VmFsIDwgQVNGX0FDUElfU1RBVEVfVU5ERUZJTkVEICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjcGlTdGF0ZSA9IFJldFZhbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgewogICAgICAgICAgICAgICAgICAgICAgICAvLyAgNjRiaXQgcGxhdGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgWHNkdEFkZHIgPSAqKCAoU0tfVTY0ICopKHBVOCArIDI0KSApOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZkFjcGkgLT4gWFNEVCAoMHgleClcbiIsIFhzZHRBZGRyICkpOwogICAgICAgICAgICAgICAgICAgICAgICBSZXRWYWwgPSBTa0FzZkFjcGlYc2R0KCBwQUMsIElvQywgcEltYWdlLCBTZWN0aW9uSGFuZGxlLCBYc2R0QWRkciApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiggUmV0VmFsIDwgQVNGX0FDUElfU1RBVEVfVU5ERUZJTkVEICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjcGlTdGF0ZSA9IFJldFZhbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcFU4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGkgPj0gKDB4MWZmZmYtNykgKSAgewogICAgICAgICAgICAgICAgQWNwaVN0YXRlID0gQVNGX0FDUElfU1RBVEVfRVJST1JfTk9fUlNEUFRSOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZBY3BpIC0+ICoqKiBFcnJvcjogbm8gUlNEIFBUUiBmb3VuZFxuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vICBVcGRhdGUgR1VJRAogICAgICAgICAgICAvLyAgU2VhcmNoIGZvciB0aGUgIl9VVUlEXyIgc2lnbmF0dXJlCiAgICAgICAgICAgIHBVOCA9ICgodW5zaWduZWQgY2hhciAqKSBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgIGZvciggaT0wOyBpPCgweDFmZmZmLTcpOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiggKCoocFU4ICsgMCApID09ICdfJykgJiYgKCoocFU4ICsgMSApID09ICdVJykgJiYgKCoocFU4ICsgMiApID09ICdVJykgJiYgKCoocFU4ICsgMyApID09ICdJJykgJiYKICAgICAgICAgICAgICAgICAgICAoKihwVTggKyA0ICkgPT0gJ0QnKSAmJiAoKihwVTggKyA1ICkgPT0gJ18nKSAgICkgIHsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTa0FzZkFjcGkgLT4gX1VVSURfIGZvdW5kIGF0IDB4JXggKHBoeXMpXG4iLCAweGUwMDAwK2kgKSk7Ci8vICAgICAgICAgICAgICAgICAgICBSZXRWYWwgPSBTa0FzZlBhdGNoR3VpZCggcEFDLCBJb0MsIHBJbWFnZSwgKHBVOCs2KSApOwogICAgICAgICAgICAgICAgICAgIFJldFZhbCA9IFNrQXNmUGF0Y2hHdWlkKCBwQUMsIElvQywgcEltYWdlLCAocFU4KzkpICk7ICAgLy8gcHcgQnVnIEZpeAogICAgICAgICAgICAgICAgICAgIGlmKCBSZXRWYWwgPCBBU0ZfQUNQSV9TVEFURV9VTkRFRklORUQgKQogICAgICAgICAgICAgICAgICAgICAgICBBY3BpU3RhdGUgPSBSZXRWYWw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcFU4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIGkgPj0gKDB4MWZmZmYtNykgKSAgewogICAgICAgICAgICAgICAgQWNwaVN0YXRlID0gQVNGX0FDUElfU1RBVEVfRVJST1JfTk9fUlNEUFRSOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZBY3BpIC0+ICoqKiBFcnJvcjogbm8gX1VVSURfIGZvdW5kXG4iKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFp3VW5tYXBWaWV3T2ZTZWN0aW9uKCBOdEN1cnJlbnRQcm9jZXNzKCksIEJhc2VBZGRyZXNzICk7CiAgICAgICAgfSAgLy8gIGlmKCBOdFJldCA9PSBTVEFUVVNfU1VDQ0VTUyApICB7CiAgICAgICAgWndDbG9zZSggU2VjdGlvbkhhbmRsZSApOwogICAgfQoKICAgIHJldHVybiggQWNwaVN0YXRlICk7Cn0KI2VuZGlmCgojaWYgKDApCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNrQXNmQWNwaVJzZHQKKgoqIERlc2NyaXB0aW9uOiAgU2VhcmNoZXMgaW4gdGhlIHBvaW50ZXIgbGlzdCBvZiB0aGUgUlNEVCB0YWJsZSBmb3IgdGhlICJBU0YhIgoqICAgICAgICAgICAgICAgdGFibGUgcG9pbnRlci4KKgoqIE5vdGVzOiAgICAgICAgbm9uZQoqCiogQ29udGV4dDogICAgICBub25lCioKKiBSZXR1cm5zOiAgICAgICAxOiBPSwoqICAgICAgICAgICAgICAgIDA6IFVOREVGSU5FRAoqICAgICAgICAgICAgICAgPDA6IEVycm9yIENvZGVzCioKKi8KU0tfSTggU2tBc2ZBY3BpUnNkdCgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQywKU0tfVTggICAqcEltYWdlLApIQU5ETEUgIFNlY3Rpb25IYW5kbGUsClNLX1UzMiAgUGh5c0FkZHIgICAgKSAgewogICAgU0tfSTggUmV0VmFsOwogICAgTlRTVEFUVVMgICAgICAgICAgICBOdFJldDsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKnBVODsKICAgIFBWT0lEICAgICAgICAgICAgICAgQmFzZUFkZHJlc3M7CiAgICBVTE9ORyAgICAgICAgICAgICAgIENvbW1pdFNpemU7CiAgICBVTE9ORyAgICAgICAgICAgICAgIGk7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIE1heFNpemU7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIFNlY3RPZmZzZXQ7CiAgICBTSVpFX1QgICAgICAgICAgICAgIFZpZXdTaXplOwoKICAgIFNLX1UzMiAgICAgICAgICAgICAgTGVuZ3RoOwogICAgU0tfVTMyICAgICAgICAgICAgICBOdW1UYWJsZXM7CiAgICBTS19VMzIgICAgICAgICAgICAgIFRhYmxlQWRkcjsKICAgIFNLX1U4ICAgICAgICAgICAgICAgQ2hlY2tTdW07CiAgICBTS19VOCAgICAgICAgICAgICAgIFJldjsKCiAgICBSZXRWYWwgPSBBU0ZfQUNQSV9TVEFURV9VTkRFRklORUQ7CgogICAgLy8gIFRyeSB0byBtYXAgYSB2aWV3IHRvIHRoZSAiUlNEVCIgdGFibGUKICAgIEJhc2VBZGRyZXNzID0gTlVMTDsKICAgIFNlY3RPZmZzZXQuUXVhZFBhcnQgPSAgIFBoeXNBZGRyOyAvLyAgd2lsbCBiZSByb3VuZGV0IGRvd24gdG8gdGhlIG5leHQgYWxsb2NhdGlvbiBib3VuZGVyeQogICAgQ29tbWl0U2l6ZSA9ICAgICAgICAgICAgUEFHRV9TSVpFKjI7CiAgICBWaWV3U2l6ZSA9ICAgICAgICAgICAgICBQQUdFX1NJWkUqMjsKICAgIE50UmV0ID0gWndNYXBWaWV3T2ZTZWN0aW9uKCBTZWN0aW9uSGFuZGxlLCAgICAgICAgICAvLyBJTiBIQU5ETEUgIFNlY3Rpb25IYW5kbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdEN1cnJlbnRQcm9jZXNzKCksICAgICAvLyBJTiBIQU5ETEUgIFByb2Nlc3NIYW5kbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQmFzZUFkZHJlc3MsICAgICAgICAgICAvLyBJTiBPVVQgUFZPSUQgICpCYXNlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLCAgICAgICAgICAgICAgICAgICAgIC8vIElOIFVMT05HICBaZXJvQml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1pdFNpemUsICAgICAgICAgICAgIC8vIElOIFVMT05HICBDb21taXRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTZWN0T2Zmc2V0LCAgICAgICAgICAgIC8vIElOIE9VVCBQTEFSR0VfSU5URUdFUiAgU2VjdGlvbk9mZnNldCAgT1BUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZpZXdTaXplLCAgICAgICAgICAgICAgLy8gSU4gT1VUIFBTSVpFX1QgIFZpZXdTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdTaGFyZSwgICAgICAgICAgICAgIC8vIElOIFNFQ1RJT05fSU5IRVJJVCAgSW5oZXJpdERpc3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIElOIFVMT05HICBBbGxvY2F0aW9uVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1JFQURPTkxZICAgICAgICAgICAvLyBJTiBVTE9ORyAgUHJvdGVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICBpZiggTnRSZXQgPT0gU1RBVFVTX1NVQ0NFU1MgKSAgewogICAgICAgIHBVOCA9ICgodW5zaWduZWQgY2hhciAqKSBCYXNlQWRkcmVzcyk7CiAgICAgICAgLy8gICBzZWFyY2ggZm9yICJSU0RUIiBzaWduYXR1cmUsIGJlY2F1c2UgQmFzZUFkZHJlc3MgaXMgcm91bmRldCBkb3duIHRvIHRoZQogICAgICAgIC8vICAgbmV4dCBhbGxvY2F0aW9uIGJvdW5kYXJ5ICAoUEFHRV9TSVpFID8/KQogICAgICAgIGZvciggaT0wOyBpPFBBR0VfU0laRTsgaSsrICkgIHsKICAgICAgICAgICAgaWYoICgqKHBVOCArIDAgKSA9PSAnUicpICYmICgqKHBVOCArIDEgKSA9PSAnUycpICYmCiAgICAgICAgICAgICAgICAoKihwVTggKyAyICkgPT0gJ0QnKSAmJiAoKihwVTggKyAzICkgPT0gJ1QnKSAgICApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcFU4Kys7CiAgICAgICAgfQogICAgICAgIC8vICBpZiAiUlNEVCIgVGFibGUgaGFzIGJlZW4gZm91bmQsIGNoZWNrIGhlYWRlcgogICAgICAgIGlmKCBpIDwgUEFHRV9TSVpFICkgIHsKICAgICAgICAgICAgLy8gIENoZWNrIHRoZSBzaWduYXR1cmUgYW5kIGhlYWRlcgogICAgICAgICAgICBMZW5ndGggPSAqKCAoU0tfVTMyICopIChwVTggKyA0KSApOwogICAgICAgICAgICBSZXYgPSAqKCBwVTggKyA4KTsKICAgICAgICAgICAgQ2hlY2tTdW0gPSAwOwogICAgICAgICAgICBmb3IoIGk9MDsgaTxMZW5ndGg7IGkrKyApCiAgICAgICAgICAgICAgICBDaGVja1N1bSArPSAqKHBVOCtpKTsKICAgICAgICAgICAgaWYoIChDaGVja1N1bSA9PSAwKSAmJiAoUmV2ID09IDEpICkgIHsKICAgICAgICAgICAgICAgIGlmKCAoTGVuZ3RoID49IFRBQkxFX0hFQURFUl9MRU5HVEgpKSAgewogICAgICAgICAgICAgICAgICAgIE51bVRhYmxlcyA9IChMZW5ndGggLSBUQUJMRV9IRUFERVJfTEVOR1RIKSAvIDQ7CiAgICAgICAgICAgICAgICAgICAgLy8gU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiU2tBc2ZBY3BpUnNkdCAtPiAlZCB0YWJsZXMgaW4gdGhlIGxpc3RcbiIsIE51bVRhYmxlcykpOwogICAgICAgICAgICAgICAgICAgIHBVOCArPSBUQUJMRV9IRUFERVJfTEVOR1RIOwogICAgICAgICAgICAgICAgICAgIC8vICBjaGVjayBhbGwgbGlzdCBlbnRyaWVzIChwaHlzLiBhZGRyKSBmb3IgYSB2YWxpZCAiQVNGISIgdGFibGUKICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTxOdW1UYWJsZXM7IGkrKyApICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJldFZhbCA9IFNrQXNmQWNwaUFzZiggcEFDLCBJb0MsIHBJbWFnZSwgU2VjdGlvbkhhbmRsZSwgKigoU0tfVTMyICopIHBVOCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIFJldFZhbCA9PSBBU0ZfQUNQSV9TVEFURV9PSyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgcFU4ICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIFJldFZhbCA9IEFTRl9BQ1BJX1NUQVRFX0VSUk9SX1JTRFRfTk9fVEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfUlNEVF9IRUFERVI7CiAgICAgICAgfSAgLy8gIGlmKCBpIDwgUEFHRV9TSVpFICkgIHsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFJldFZhbCA9IEFTRl9BQ1BJX1NUQVRFX0VSUk9SX1JTRFQ7CiAgICAgICAgWndVbm1hcFZpZXdPZlNlY3Rpb24oIE50Q3VycmVudFByb2Nlc3MoKSwgQmFzZUFkZHJlc3MgKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBSZXRWYWwgPSBBU0ZfQUNQSV9TVEFURV9FUlJPUl9SU0RUOwoKICAgIHJldHVybiggUmV0VmFsICk7Cn0KI2VuZGlmCgojaWYgKDApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZBY3BpWHNkdAoqCiogRGVzY3JpcHRpb246ICBTZWFyY2hlcyBpbiB0aGUgcG9pbnRlciBsaXN0IG9mIHRoZSBYU0RUIHRhYmxlIGZvciB0aGUgIkFTRiEiCiogICAgICAgICAgICAgICB0YWJsZSBwb2ludGVyLgoqCiogTm90ZXM6ICAgICAgICBub25lCioKKiBDb250ZXh0OiAgICAgIG5vbmUKKgoqIFJldHVybnM6ICAgICAgIDE6IE9LCiogICAgICAgICAgICAgICAgMDogVU5ERUZJTkVECiogICAgICAgICAgICAgICA8MDogRXJyb3IgQ29kZXMKKgoqLwpTS19JOCBTa0FzZkFjcGlYc2R0KApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VOCAgICpwSW1hZ2UsCkhBTkRMRSAgU2VjdGlvbkhhbmRsZSwKU0tfVTY0ICBQaHlzQWRkciApICB7CiAgICBTS19JOCBSZXRWYWw7CgogICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfWFNEVDsKCiAgICByZXR1cm4oIFJldFZhbCApOwp9CiNlbmRpZgoKI2lmICgwKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNrQXNmQWNwaUFzZgoqCiogRGVzY3JpcHRpb246ICBDaGVja3MsIHdoZXRoZXIgdGhlIGdpdmVuIFBoeXNBZGRyIHBvaW50cyB0byBhIHZhbGlkIEFTRiEgdGFibGUuCioKKiBOb3RlczogICAgICAgIG5vbmUKKgoqIENvbnRleHQ6ICAgICAgbm9uZQoqCiogUmV0dXJuczogICAgICAgMTogT0sKKiAgICAgICAgICAgICAgICAwOiBVTkRFRklORUQKKiAgICAgICAgICAgICAgIDwwOiBFcnJvciBDb2RlcwoqCiovClNLX0k4IFNrQXNmQWNwaUFzZigKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQywKU0tfVTggICAqcEltYWdlLApIQU5ETEUgIFNlY3Rpb25IYW5kbGUsClNLX1UzMiAgUGh5c0FkZHIgICAgKSAgewogICAgU0tfSTggUmV0VmFsOwogICAgTlRTVEFUVVMgICAgICAgICAgICBOdFJldDsKICAgIHVuc2lnbmVkIGNoYXIgICAgICAgKnBVODsKICAgIFBWT0lEICAgICAgICAgICAgICAgQmFzZUFkZHJlc3M7CiAgICBVTE9ORyAgICAgICAgICAgICAgIENvbW1pdFNpemU7CiAgICBVTE9ORyAgICAgICAgICAgICAgIGk7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIE1heFNpemU7CiAgICBMQVJHRV9JTlRFR0VSICAgICAgIFNlY3RPZmZzZXQ7CiAgICBTSVpFX1QgICAgICAgICAgICAgIFZpZXdTaXplOwoKICAgIFNLX1UzMiAgICAgICAgICAgICAgTGVuZ3RoOwogICAgU0tfVTMyICAgICAgICAgICAgICBOdW1UYWJsZXM7CiAgICBTS19VMzIgICAgICAgICAgICAgIFRhYmxlQWRkcjsKICAgIFNLX1U4ICAgICAgICAgICAgICAgQ2hlY2tTdW07CiAgICBTS19VOCAgICAgICAgICAgICAgIFJldjsKCiAgICBORElTX1NUQVRVUyAgICAgU3RhdHVzOwogICAgTkRJU19IQU5ETEUgICAgIEZpbGVIYW5kbGU7CiAgICBVSU5UICAgICAgICAgICAgRmlsZUxlbmd0aDsKICAgIFNLX1U4ICAgICAgICAgICAqcEFjcGlBc2Y7CgogICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfUlNEVF9OT19BU0ZfVEFCTEU7CgogICAgLyogVHJ5IHRvIG9wZW4gdGhlIEFTRiBTaW11bGF0aW9uIGZpbGUgKEFjcGlBc2YuYmluKSAqLwogICAgTmRpc09wZW5GaWxlKCAoUE5ESVNfU1RBVFVTKSAmU3RhdHVzLAogICAgICAgICAgICAgICAgICAoUE5ESVNfSEFORExFKSAmRmlsZUhhbmRsZSwKICAgICAgICAgICAgICAgICAgKFBVSU5UKSAmRmlsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgKFBORElTX1NUUklORykgJlNpbXVBc2ZUYWIsCiAgICAgICAgICAgICAgICAgIEhpZ2hlc3RQaHlzQWRkcmVzcyAgKTsKCiAgICBpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewogICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIioqKiBBY3BpQXNmLmJpbiBvcGVuZWQgc3VjY2Vzc2Z1bGx5ICoqKlxuIikpOwogICAgICAgIC8qIFRyeSB0byBtYXAgQWNwaUFzZi5iaW4gKi8KICAgICAgICBOZGlzTWFwRmlsZSggKFBORElTX1NUQVRVUykmU3RhdHVzLCAoUFZPSUQpJnBBY3BpQXNmLCBGaWxlSGFuZGxlICk7CiAgICAgICAgaWYoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKICAgICAgICAgICAgcFU4ID0gKCh1bnNpZ25lZCBjaGFyICopIHBBY3BpQXNmKTsKICAgICAgICAgICAgLy8gICBzZWFyY2ggZm9yICJBU0YhIiBzaWduYXR1cmUsIGJlY2F1c2UgQmFzZUFkZHJlc3MgaXMgcm91bmRldCBkb3duIHRvIHRoZQogICAgICAgICAgICAvLyAgIG5leHQgYWxsb2NhdGlvbiBib3VuZGFyeSAgKFBBR0VfU0laRSA/PykKICAgICAgICAgICAgZm9yKCBpPTA7IGk8UEFHRV9TSVpFOyBpKysgKSAgewogICAgICAgICAgICAgICAgaWYoICgqKHBVOCArIDAgKSA9PSAnQScpICYmICgqKHBVOCArIDEgKSA9PSAnUycpICYmCiAgICAgICAgICAgICAgICAgICAgKCoocFU4ICsgMiApID09ICdGJykgJiYgKCoocFU4ICsgMyApID09ICchJykgICAgKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHBVOCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vICBpZiAiQVNGISIgVGFibGUgaGFzIGJlZW4gZm91bmQsIGNoZWNrIGhlYWRlcgogICAgICAgICAgICBpZiggaSA8IFBBR0VfU0laRSApICB7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCJTaW11bGF0aW9uIEFTRiEgdGFibGUgZm91bmRcbiIpKTsKICAgICAgICAgICAgICAgIExlbmd0aCA9ICooIChTS19VMzIgKikgKHBVOCArIDQpICk7CiAgICAgICAgICAgICAgICBSZXYgPSAqKCBwVTggKyA4KTsKICAgICAgICAgICAgICAgIENoZWNrU3VtID0gMDsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPExlbmd0aDsgaSsrICkKICAgICAgICAgICAgICAgICAgICBDaGVja1N1bSArPSAqKHBVOCtpKTsKICAgICAgICAgICAgICAgIGlmKCAoQ2hlY2tTdW0gPT0gMCkgJiYgKCAoUmV2ID09IDB4MTApIHx8IChSZXYgPT0gMHgyMCkgKSApICB7ICAvLyAgUmV2aXNpb24gMHgxMCwgMHgyMCA9PiBBU0YKICAgICAgICAgICAgICAgICAgICBSZXRWYWwgPSBTa0FzZlBhdGNoQXNmVGFibGUoIHBBQywgSW9DLCBwSW1hZ2UsIHBVOCwgTGVuZ3RoICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfQVNGX0hFQURFUjsKICAgICAgICAgICAgfSAgLy8gIGlmKCBpIDwgUEFHRV9TSVpFICkgIHsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfQVNGOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgeyAvLyBObyBTaW11bGF0aW9uIEZpbGUsIHRha2UgUkVBTCBBU0YhIFRhYmxlCiAgICAgICAgLy8gIFRyeSB0byBtYXAgYSB2aWV3IHRvIHRoZSAiQVNGIiB0YWJsZQogICAgICAgIEJhc2VBZGRyZXNzID0gTlVMTDsKICAgICAgICBTZWN0T2Zmc2V0LlF1YWRQYXJ0ID0gICBQaHlzQWRkcjsKICAgICAgICBDb21taXRTaXplID0gICAgICAgICAgICBQQUdFX1NJWkUqMjsKICAgICAgICBWaWV3U2l6ZSA9ICAgICAgICAgICAgICBQQUdFX1NJWkUqMjsKICAgICAgICBOdFJldCA9IFp3TWFwVmlld09mU2VjdGlvbiggU2VjdGlvbkhhbmRsZSwgICAgICAgICAgLy8gSU4gSEFORExFICBTZWN0aW9uSGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE50Q3VycmVudFByb2Nlc3MoKSwgICAgIC8vIElOIEhBTkRMRSAgUHJvY2Vzc0hhbmRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQmFzZUFkZHJlc3MsICAgICAgICAgICAvLyBJTiBPVVQgUFZPSUQgICpCYXNlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwgICAgICAgICAgICAgICAgICAgICAvLyBJTiBVTE9ORyAgWmVyb0JpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWl0U2l6ZSwgICAgICAgICAgICAgLy8gSU4gVUxPTkcgIENvbW1pdFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTZWN0T2Zmc2V0LCAgICAgICAgICAgIC8vIElOIE9VVCBQTEFSR0VfSU5URUdFUiAgU2VjdGlvbk9mZnNldCAgT1BUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZWaWV3U2l6ZSwgICAgICAgICAgICAgIC8vIElOIE9VVCBQU0laRV9UICBWaWV3U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld1NoYXJlLCAgICAgICAgICAgICAgLy8gSU4gU0VDVElPTl9JTkhFUklUICBJbmhlcml0RGlzcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIElOIFVMT05HICBBbGxvY2F0aW9uVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9SRUFET05MWSAgICAgICAgICAgLy8gSU4gVUxPTkcgIFByb3RlY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICBpZiggTnRSZXQgPT0gU1RBVFVTX1NVQ0NFU1MgKSAgewogICAgICAgICAgICBwVTggPSAoKHVuc2lnbmVkIGNoYXIgKikgQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAvLyAgIHNlYXJjaCBmb3IgIkFTRiEiIHNpZ25hdHVyZSwgYmVjYXVzZSBCYXNlQWRkcmVzcyBpcyByb3VuZGV0IGRvd24gdG8gdGhlCiAgICAgICAgICAgIC8vICAgbmV4dCBhbGxvY2F0aW9uIGJvdW5kYXJ5ICAoUEFHRV9TSVpFID8/KQogICAgICAgICAgICBmb3IoIGk9MDsgaTxQQUdFX1NJWkU7IGkrKyApICB7CiAgICAgICAgICAgICAgICBpZiggKCoocFU4ICsgMCApID09ICdBJykgJiYgKCoocFU4ICsgMSApID09ICdTJykgJiYKICAgICAgICAgICAgICAgICAgICAoKihwVTggKyAyICkgPT0gJ0YnKSAmJiAoKihwVTggKyAzICkgPT0gJyEnKSAgICApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcFU4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gIGlmICJBU0YhIiBUYWJsZSBoYXMgYmVlbiBmb3VuZCwgY2hlY2sgaGVhZGVyCiAgICAgICAgICAgIGlmKCBpIDwgUEFHRV9TSVpFICkgIHsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlNrQXNmQWNwaUFzZiAtPiBBU0YhIHRhYmxlIGZvdW5kIGF0IDB4JXggKHBoeXMpXG4iLCBQaHlzQWRkciApKTsKICAgICAgICAgICAgICAgIExlbmd0aCA9ICooIChTS19VMzIgKikgKHBVOCArIDQpICk7CiAgICAgICAgICAgICAgICBSZXYgPSAqKCBwVTggKyA4KTsKICAgICAgICAgICAgICAgIENoZWNrU3VtID0gMDsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPExlbmd0aDsgaSsrICkKICAgICAgICAgICAgICAgICAgICBDaGVja1N1bSArPSAqKHBVOCtpKTsKICAgICAgICAgICAgICAgIGlmKCAoQ2hlY2tTdW0gPT0gMCkgJiYgKCAoUmV2ID09IDB4MTApIHx8IChSZXYgPT0gMHgyMCkgKSApICB7ICAvLyAgUmV2aXNpb24gMHgxMCwgMHgyMCA9PiBBU0YKICAgICAgICAgICAgICAgICAgICBSZXRWYWwgPSBTa0FzZlBhdGNoQXNmVGFibGUoIHBBQywgSW9DLCBwSW1hZ2UsIHBVOCwgTGVuZ3RoICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfQVNGX0hFQURFUjsKICAgICAgICAgICAgfSAgLy8gIGlmKCBpIDwgUEFHRV9TSVpFICkgIHsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfQVNGOwoKICAgICAgICAgICAgWndVbm1hcFZpZXdPZlNlY3Rpb24oIE50Q3VycmVudFByb2Nlc3MoKSwgQmFzZUFkZHJlc3MgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBSZXRWYWwgPSBBU0ZfQUNQSV9TVEFURV9FUlJPUl9BU0Y7CgogICAgICAgIFp3VW5tYXBWaWV3T2ZTZWN0aW9uKCBOdEN1cnJlbnRQcm9jZXNzKCksIEJhc2VBZGRyZXNzICk7CiAgICB9CgogICAgcmV0dXJuKCBSZXRWYWwgKTsKfQojZW5kaWYKCiNpZiAoMCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBTa0FzZlBhdGNoQXNmVGFibGUKKgoqIERlc2NyaXB0aW9uOiAgT3Z2ZXJpZGVzIHRoZSB0YWJsZSBpbiB0aGUgZncgaW1hZ2Ugd2l0aCB0aGUgY3VycmVudAoqICAgICAgICAgICAgICAgQklPUyAtIEFTRiEgLSB0YWJsZS4KKgoqIE5vdGVzOiAgICAgICAgbm9uZQoqCiogQ29udGV4dDogICAgICBub25lCioKKiBSZXR1cm5zOiAgICAgICAxOiBPSwoqICAgICAgICAgICAgICAgIDA6IFVOREVGSU5FRAoqICAgICAgICAgICAgICAgPDA6IEVycm9yIENvZGVzCioKKi8KU0tfSTggU2tBc2ZQYXRjaEFzZlRhYmxlKApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VOCAqcEltYWdlLApTS19VOCAqcEFzZlRhYmxlLApTS19VMzIgVGFibGVMZW5ndGggKSAgewoKICAgIFNLX0k4ICAgICAgICAgICBSZXRWYWw7CiAgICBTS19VMzIgICAgICAgICAgaSxqOwogICAgU0tfVTggICAgICAgICAgICpwQWNwaUFzZjsKICAgIFNLX1U4ICAgICAgICAgICBGd0ltYWdlQ3NPazsKICAgIFNLX1UzMiAgICAgICAgICBGd0ltYWdlQ3M7CiAgICBTS19VMzIgICAgICAgICAgRndDczsKICAgIFNLX1UzMiAgICAgICAgICAqcFRtcDMyOwoKICAgIFJldFZhbCA9IEFTRl9BQ1BJX1NUQVRFX09LOwoKICAgIC8vICBjYWxjdWxhdGUgQ1Mgb2YgdGhlIEZXIGltYWdlCiAgICBwVG1wMzIgPSAoU0tfVTMyICopIHBJbWFnZTsKICAgIGZvciggaT0wLCBGd0NzPTA7IGk8QVNGX0ZMQVNIX1NJWkU7IGkrPTQgKSAgewogICAgICAgIEZ3Q3MgKz0gKnBUbXAzMjsKICAgICAgICBwVG1wMzIrKzsKICAgIH0KICAgIGlmKCBGd0NzID09IDAgICkgIHsgIC8vICBDUyA9PSAwID0+IE8uSy4KICAgICAgICBwQWNwaUFzZiA9IChTS19VOCAqKSAocEltYWdlICsgQVNGX0ZMQVNIX09GRlNfQUNQSSk7CiAgICAgICAgLy8gIHdyaXRlIG5ldyAiQVNGISIgLSB0YWJsZSB0byB0aGUgRlcgaW1hZ2UgZmlsZQogICAgICAgIGZvciggaT0wOyBpPFRhYmxlTGVuZ3RoOyBpKysgKSAgewogICAgICAgICAgICAqKHBBY3BpQXNmK2kpID0gKihwQXNmVGFibGUraSk7CiAgICAgICAgfQogICAgICAgIC8vICBlcmFzZSBkeW5hbWljIHBhcnRzIG9mIHRoZSBBU0YhIC0gdGFibGUKICAgICAgICBTa0FzZkV4YW1pbmVBc2ZUYWJsZSggcEFDLCBJb0MsIHBBY3BpQXNmLCBUYWJsZUxlbmd0aCApOwogICAgICAgIC8vICBjYWxjdWxhdGUgbmV3IEZXIGltYWdlIGNoZWNrc3VtCiAgICAgICAgcFRtcDMyID0gKFNLX1UzMiAqKSBwSW1hZ2U7CiAgICAgICAgZm9yKCBpPTAsIEZ3Q3M9MDsgaTxBU0ZfRkxBU0hfU0laRS00OyBpKz00ICkgIHsKICAgICAgICAgICAgRndDcyArPSAqcFRtcDMyOwogICAgICAgICAgICBwVG1wMzIrKzsKICAgICAgICB9CiAgICAgICAgKnBUbXAzMiA9ICh+RndDcykrMTsKICAgIH0gIC8vICBpZiggRndDcyA9PSAwICApICB7ICAvLyAgQ1MgPT0gMCA9PiBPLksuCiAgICBlbHNlCiAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfRklMRV9DUzsKCiAgICByZXR1cm4oIFJldFZhbCk7Cn0KI2VuZGlmCgojaWYgKDApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZQYXRjaEd1aWQKKgoqIERlc2NyaXB0aW9uOiAgT3Z2ZXJpZGVzIHRoZSBHVUlEIGluIHRoZSBmdyBpbWFnZSB3aXRoIHRoZSBjdXJyZW50CiogICAgICAgICAgICAgICBTTUJpb3MgVVVJRC4KKgoqIE5vdGVzOiAgICAgICAgbm9uZQoqCiogQ29udGV4dDogICAgICBub25lCioKKiBSZXR1cm5zOiAgICAgICAxOiBPSwoqICAgICAgICAgICAgICAgIDA6IFVOREVGSU5FRAoqICAgICAgICAgICAgICAgPDA6IEVycm9yIENvZGVzCioKKi8KU0tfSTggU2tBc2ZQYXRjaEd1aWQoClNLX0FDICAgKnBBQywKU0tfSU9DICBJb0MsClNLX1U4ICpwSW1hZ2UsClNLX1U4ICpwR3VpZCApICB7CiAgICBTS19JOCAgICAgICAgICAgUmV0VmFsOwogICAgU0tfVTMyICAgICAgICAgIGk7CiAgICBTS19VOCAgICAgICAgICAgKnBBY3BpQXNmOwogICAgU0tfVTggICAgICAgICAgIEZ3SW1hZ2VDc09rOwogICAgU0tfVTMyICAgICAgICAgIEZ3SW1hZ2VDczsKICAgIFNLX1UzMiAgICAgICAgICBGd0NzOwogICAgU0tfVTMyICAgICAgICAgICpwVG1wMzI7CgogICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfT0s7CgogICAgLy8gIGNhbGN1bGF0ZSBDUyBvZiB0aGUgRlcgaW1hZ2UKICAgIHBUbXAzMiA9IChTS19VMzIgKikgcEltYWdlOwogICAgZm9yKCBpPTAsIEZ3Q3M9MDsgaTxBU0ZfRkxBU0hfU0laRTsgaSs9NCApICB7CiAgICAgICAgRndDcyArPSAqcFRtcDMyOwogICAgICAgIHBUbXAzMisrOwogICAgfQogICAgaWYoIEZ3Q3MgPT0gMCAgKSAgeyAgLy8gIENTID09IDAgPT4gTy5LLgogICAgICAgIHBBY3BpQXNmID0gKFNLX1U4ICopIChwSW1hZ2UgKyBBU0ZfRkxBU0hfT0ZGU19HVUlEKTsKICAgICAgICAvLyAgd3JpdGUgbmV3IEdVSUQgdGFibGUgdG8gdGhlIEZXIGltYWdlIGZpbGUKICAgICAgICBmb3IoIGk9MDsgaTwxNjsgaSsrICkgIHsKICAgICAgICAgICAgKihwQWNwaUFzZitpKSA9ICoocEd1aWQraSk7CiAgICAgICAgfQogICAgICAgIC8vICBjYWxjdWxhdGUgbmV3IEZXIGltYWdlIGNoZWNrc3VtCiAgICAgICAgcFRtcDMyID0gKFNLX1UzMiAqKSBwSW1hZ2U7CiAgICAgICAgZm9yKCBpPTAsIEZ3Q3M9MDsgaTxBU0ZfRkxBU0hfU0laRS00OyBpKz00ICkgIHsKICAgICAgICAgICAgRndDcyArPSAqcFRtcDMyOwogICAgICAgICAgICBwVG1wMzIrKzsKICAgICAgICB9CiAgICAgICAgKnBUbXAzMiA9ICh+RndDcykrMTsKICAgIH0gIC8vICBpZiggRndDcyA9PSAwICApICB7ICAvLyAgQ1MgPT0gMCA9PiBPLksuCiAgICBlbHNlCiAgICAgICAgUmV0VmFsID0gQVNGX0FDUElfU1RBVEVfRVJST1JfRklMRV9DUzsKCiAgICByZXR1cm4oIFJldFZhbCk7Cn0KI2VuZGlmCgojaWYgKDApCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogU2tBc2ZFeGFtaW5lQXNmVGFibGUKKgoqIERlc2NyaXB0aW9uOiAgT3Z2ZXJpZGVzIHRoZSBkeW5hbWljIHBhcnRzIG9mIHRoZSBBU0YhIHRhYmxlIGluIG9yZGVyIHRvCiogICAgICAgICAgICAgICBhdm9pZCBmcmVxdWVudGx5IGZsYXNoIHdyaXRlcyBjYXVzZWQgYnkgY2hhbmdpbmcgZGF0YS4KKgoqIE5vdGVzOiAgICAgICAgbm9uZQoqCiogQ29udGV4dDogICAgICBub25lCioKKiBSZXR1cm5zOiAgICAgICAxOiBPSwoqICAgICAgICAgICAgICAgIDA6IFVOREVGSU5FRAoqICAgICAgICAgICAgICAgPDA6IEVycm9yIENvZGVzCioKKi8Kdm9pZCBTa0FzZkV4YW1pbmVBc2ZUYWJsZSgKU0tfQUMgICAqcEFDLApTS19JT0MgIElvQywKU0tfVTggKnBBc2YsClNLX1UzMiBUYWJsZUxlbmd0aCApICB7CiAgICBTS19VOCAgICpwVG1wLCAqcFJtY3AsICp4OwogICAgU0tfVTggICBUeXBlOwogICAgU0tfVTggICBMYXN0UmVjb3JkOwogICAgU0tfVTggICBDczsKICAgIFNLX1UxNiAgTGVuZ3RoOwogICAgU0tfVTE2ICBpLGo7CgogICAgLy8gY29weSB0aGUgQVNGIHRhYmxlIHRvIG91ciBhc2YtbWliIHN0cnVjdHVyZQogICAgLy8gYW5kIHByaW50IHRoZSBhc2YgdGFibGUgdG8gZGVidWcgb3V0cHV0CiAgICBwQUMtPkFzZkRhdGEuTWliLkFjcGkubGVuZ3RoID0gVGFibGVMZW5ndGg7CiAgICBmb3IoIGk9MDsgaTxUYWJsZUxlbmd0aDsgaSsrICkgIHsKICAgICAgICBpZiAoaSA8IEFTRl9BQ1BJX01BWEJVRkZMRU5HVEgpIHsKICAgICAgICAgICAgcEFDLT5Bc2ZEYXRhLk1pYi5BY3BpLmJ1ZmZlcltpXSA9ICoocEFzZitpKTsKICAgICAgICB9CiAgICAgICAgaWYoIGkgJSAxNiApICB7CiAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAlMDJ4IiwgKihwQXNmK2kpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4gJTAyeCIsICoocEFzZitpKSkpOwogICAgICAgIH0KICAgIH0KICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlxuIikpOwoKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlxuQVNGISBUYWJsZTpcbiIpKTsKICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBMOiVkIFJldjolZCBDczoweCV4XG4iLCAqKChTS19VMzIgKikocEFzZis0KSksICoocEFzZis4KSwqKHBBc2YrOSkgICkpOwogICAgcFRtcCA9IHBBc2YrMzY7ICAvLyAgb2Zmc2V0IHRvIHRoZSAxc3QgaW5mb3JtYXRpb24gcmVjb3JkCiAgICBkbyB7CiAgICAgICAgVHlwZSA9ICAgICAgICAgICgqcFRtcCkgJiAweDdmOwogICAgICAgIExhc3RSZWNvcmQgPSAgICAoKnBUbXApICYgMHg4MDsKICAgICAgICBMZW5ndGggPSAgICAgICAgKigoU0tfVTE2ICopIChwVG1wKzIpKTsKICAgICAgICBzd2l0Y2goIFR5cGUgKSAgewogICAgICAgICAgICBjYXNlIEFTRl9SRUNPUkRfSU5GTzoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBBU0ZfSU5GTyBMOiVkXG4iLCAqKChTS19VMTYgKikocFRtcCsyKSkgKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICBNaW5XZCAlZCBNaW5XYWl0OiVkXG4iLCAqKHBUbXArNCksKihwVG1wKzUpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgU3lzdGVtSWQ6ICAgJTAyeFxuIiwgKigoU0tfVTE2ICopKHBUbXArNikpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgTWFudWZhY3RJZDogJTAyeCAlMDJ4ICUwMnggJTAyeCBGbGFnczoweCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwVG1wKzgpLCoocFRtcCs5KSwqKHBUbXArMTApLCoocFRtcCsxMSksKihwVG1wKzEyKSAgKSk7CiAgICAgICAgICAgICAgICBwVG1wICs9IExlbmd0aDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFTRl9SRUNPUkRfQUxSVDoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBBU0ZfQUxSVCBMOiVkXG4iLCAqKChTS19VMTYgKikocFRtcCs0KSkgKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICBBczoweCV4IERBczoweCV4XG4iLCAqKHBUbXArNCksKihwVG1wKzUpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgTnVtQWxydDolZCBMOiVkXG4iLCAqKHBUbXArNiksKihwVG1wKzcpICkpOwogICAgICAgICAgICAgICAgeCA9IHBUbXArODsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPCoocFRtcCs2KTsgaSsrICkgIHsKICAgICAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgIEV2JWQiLGkpKTsKICAgICAgICAgICAgICAgICAgICBmb3IoIGo9MDsgajwxMjsgaisrICkKICAgICAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICUwMngiLCAqKHgrKykgKSk7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwVG1wICs9IExlbmd0aDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFTRl9SRUNPUkRfUkNUTDoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBBU0ZfUkNUTCBMOiVkXG4iLCAqKChTS19VMTYgKikocFRtcCsyKSkgKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICBOdW1DdHJsOiVkIEw6JWRcbiIsICoocFRtcCs0KSwqKHBUbXArNSkgKSk7CiAgICAgICAgICAgICAgICB4ID0gcFRtcCs2OwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8KihwVG1wKzQpOyBpKysgKSAgewogICAgICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgQ3RybCVkIixpKSk7CiAgICAgICAgICAgICAgICAgICAgZm9yKCBqPTA7IGo8NDsgaisrICkKICAgICAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICUwMngiLCAqKHgrKykgKSk7CiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwVG1wICs9IExlbmd0aDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFTRl9SRUNPUkRfUk1DUDoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBBU0ZfUk1DUCBMOiVkXG4iLCAqKChTS19VMTYgKikocFRtcCsyKSkgKSk7CiAgICAgICAgICAgICAgICBwUm1jcCA9IHBUbXArNDsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgIikpOwogICAgICAgICAgICAgICAgZm9yKCBpPTA7IGk8MTk7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICUwMngiLCAqKHBSbWNwK2kpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4iKSk7CgogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICBSZW1DdHJsQ2FwOiIpKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDc7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICUwMngiLCAqKHBSbWNwK2kpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiXG4iKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgIEJvb3RPcHRpb25Db21wbGV0aW9uQ29kZTogJTAyeFxuIiwgKihwUm1jcCs3KSkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICBJQU5BIEVudGVycHJpc2VJZDogICAgICAgICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwUm1jcCs4KSwqKHBSbWNwKzkpLCAqKHBSbWNwKzEwKSwgKihwUm1jcCsxMSkgICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICBTcGVjaWFsQ29tbWFuZDogICAgICAgICAgICUwMnhcbiIsICoocFJtY3ArMTIpKSk7CiAgICAgICAgICAgICAgICBTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0FTRiwgU0tfREJHQ0FUX0NUUkwsKCIgICAgICAgIFNwZWNpYWxDb21tYW5kUGFyOiAgICAgICAgJTAyeCAlMDJ4XG4iLCAqKHBSbWNwKzEzKSwgKihwUm1jcCsxNCkpKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICAgICAgQm9vdE9wdGlvbnM6ICAgICAgICAgICAgICAlMDJ4ICUwMnhcbiIsICoocFJtY3ArMTUpLCAqKHBSbWNwKzE2KSkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgICBPRU0gUGFyYW1ldGVyOiAgICAgICAgICAgICUwMnggJTAyeFxuIiwgKihwUm1jcCsxNyksICoocFJtY3ArMTgpKSk7CiAgICAgICAgICAgICAgICBwUm1jcCArPSAgICA3OyAgICAgIC8vICBza2lwIFJlbW90ZSBDb250cm9sIENhcGFiaWxpdGllcwogICAgICAgICAgICAgICAgLy8gIGlmIGNwdSBpcyBydW5uaW5nLCBwcm92aWRlIFJNQ1AgZGF0YSB0byBmaXJtd2FyZQogICAgICAgICAgICAgICAgaWYoIHBBQy0+QXNmRGF0YS5DcHVBbGl2ZSApCiAgICAgICAgICAgICAgICAgICAgU2tBc2ZTZW5kUm1jcERhdGEoIHBBQywgSW9DLCBwUm1jcCwgMTIgKTsKICAgICAgICAgICAgICAgIGZvciggaT0wOyBpPDEyOyBpKysgKQogICAgICAgICAgICAgICAgICAgICoocFJtY3ArKykgPSAwOyAvLyAgZXJhc2UgZHluYW1pYyBwYXJ0IG9mIHRoZSByZWNvcmQKICAgICAgICAgICAgICAgIHBUbXAgKz0gTGVuZ3RoOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQVNGX1JFQ09SRF9BRERSOgogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgIEFTRl9BRERSIEw6JWQgU0VFUFJPTSBBZHI6MHgleCBOdW1BZGRyOiVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChTS19VMTYgKikocFRtcCsyKSksICoocFRtcCs0KSwgKihwVG1wKzUpICkpOwogICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICAgICAgQWRkcjoiKSk7CiAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaTwqKHBUbXArNSk7IGkrKyApCiAgICAgICAgICAgICAgICAgICAgU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BU0YsIFNLX0RCR0NBVF9DVFJMLCgiICUwMngiLCAqKHBUbXArNitpKSApKTsKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIlxuIikpOwogICAgICAgICAgICAgICAgcFRtcCArPSBMZW5ndGg7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQVNGLCBTS19EQkdDQVRfQ1RSTCwoIiAgICBVTktOT1dOIFR5cGU6MHgleCBMOiVkXG4iLCAqcFRtcCwgKigoU0tfVTE2ICopKHBUbXArMikpICkpOwogICAgICAgICAgICAgICAgTGFzdFJlY29yZCA9IDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYoIExhc3RSZWNvcmQgKQogICAgICAgICAgICBicmVhazsKICAgIH0gd2hpbGUgKCAoU0tfVTMyKShwVG1wLXBBc2YpIDwgVGFibGVMZW5ndGggKTsKCiAgICAvLyAgY2FsY3VsYXRlIG5ldyBjaGVja3N1bQogICAgKihwQXNmKzkpID0gMDsgLy8gIGRlbGV0ZSBvbGQgQ3MKICAgIGZvciggQ3M9MCwgaT0wOyBpPFRhYmxlTGVuZ3RoOyBpKysgKQogICAgICAgIENzICs9ICoocEFzZiArIGkpOwogICAgKihwQXNmKzkpID0gKH5DcykrMTsgIC8vICB3cml0ZSBuZXcgQ3MKCiNpZmRlZiBDU19DSEVDSwogICAgLy8gIGp1c3QgZm9yIGEgY2hlY2sKICAgIGZvciggQ3M9MCwgaT0wOyBpPFRhYmxlTGVuZ3RoOyBpKysgKQogICAgICAgIENzICs9ICoocEFzZiArIGkpOwojZW5kaWYgIC8vIENTX0NIRUNLCgogICAgcmV0dXJuOwp9CiNlbmRpZgoKClNLX0k4IFNrQXNmU2VuZFJtY3BEYXRhKApTS19BQyAgICpwQUMsClNLX0lPQyAgSW9DLApTS19VOCAgICpwRGF0YSwKU0tfVTggICBMZW5ndGggKSAgewogICAgU0tfSTggICBSZXRWYWw7CiAgICBTS19VOCAgIGxSZXRDb2RlOwogICAgU0tfVTggICBJbmQsIGk7CiAgICBTS19VOCAgIFRtcEJ1ZmZlciBbMjBdOwoKICAgIFJldFZhbCA9IDE7CiAgICBJbmQgPSAwOwoKICAgIGlmKCBMZW5ndGggPD0gMTggKSAgewogICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSBZQVNGX0hPU1RDTURfQUNQSV9STUNQX0RBVEE7CiAgICAgICAgVG1wQnVmZmVyW0luZCsrXSA9IDIgKyBMZW5ndGg7ICAvLyBMZW5ndGgKICAgICAgICBmb3IoIGk9MDsgaTxMZW5ndGg7IGkrKyApCiAgICAgICAgICAgIFRtcEJ1ZmZlcltJbmQrK10gPSAqKHBEYXRhICsgaSApOwogICAgICAgIGxSZXRDb2RlID0gQXNmSGNpU2VuZERhdGEocEFDLCBJb0MsIFRtcEJ1ZmZlciwgMCwgQVNGX0hDSV9XQUlULCAwICk7CiAgICAgICAgaWYoIGxSZXRDb2RlID09IEhDSV9FTl9DTURfRVJST1IgKQogICAgICAgICAgICBSZXRWYWwgPSAwOwogICAgfQogICAgZWxzZQogICAgICAgIFJldFZhbCA9IC0xOwoKICAgIHJldHVybiggUmV0VmFsICk7Cn0KCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi8qIEVuZCBvZiBmaWxlICovCgoK