LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUsMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgogKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKICogY29waWVzLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCiAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCi8qCiAqIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqIHVuZGVyIHByb3ByaWV0YXJ5IHRlcm1zIGJlZm9yZSBDb3B5cmlnaHQgb3duZXJzaGlwIHdhcyBhc3NpZ25lZAogKiB0byB0aGUgTGludXggRm91bmRhdGlvbi4KICovCgojaWYgIWRlZmluZWQoIF9fV0xBTl9RQ1RfUEFMX0FQSV9IICkKI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9BUElfSAoKLyoqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIAogIFxmaWxlICB3bGFuX3FjdF9wYWxfYXBpLmgKICAKICBcYnJpZWYgZGVmaW5lIGdlbmVyYWwgQVBJcyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCiAgICAgICAgICAgICAgIAogICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQKICAKICAKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCgojaWZkZWYgTUVNT1JZX0RFQlVHCiNpbmNsdWRlICJ2b3NfbWVtb3J5LmgiCiNlbmRpZiAvKiBNRU1PUllfREVCVUcgKi8KCnR5cGVkZWYgc3RydWN0IHNQYWxTdHJ1Y3QKewogICAvKj9tdXN0IGNoZWNrIHRoZSBkYXRhIHR5cGUqLwogICB2b2lkKiBkZXZIYW5kbGU7Cn0gdFBhbENvbnRleHQ7CgpleHRlcm4gdFBhbENvbnRleHQgZ0NvbnRleHQ7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqTUFDUk8qKioqKioqKioqKioqKioqKioqKioqLwoKLy8gbWFjcm8gdG8gZ2V0IG1heGltdW0gb2YgdHdvIHZhbHVlcy4KI2RlZmluZSBXUEFMX01BWCggX3gsIF95ICkgKCAoIChfeCkgPiAoX3kpICkgPyAoX3gpIDogKF95KSApICAKCi8vIG1hY3JvIHRvIGdldCBtaW5pbXVtIG9mIHR3byB2YWx1ZXMKI2RlZmluZSBXUEFMX01JTiggX3gsIF95ICkgKCAoIChfeCkgPCAoX3kpICkgPyAoX3gpIDogKF95KSAgKSAgCgovLyBtYWNybyB0byBnZXQgdGhlIGNlaWxpbmcgb2YgYW4gaW50ZWdlciBkaXZpc2lvbiBvcGVyYXRpb24uLi4KI2RlZmluZSBXUEFMX0NFSUxfRElWKCBfYSwgX2IgKSAoKCAwICE9IChfYSkgJSAoX2IpICkgPyAoIChfYSkgLyAoX2IpICsgMSApIDogKCAoX2EpIC8gKF9iKSApKQoKLy8gbWFjcm8gdG8gcmV0dXJuIHRoZSBmbG9vciBvZiBhbiBpbnRlZ2VyIGRpdmlzaW9uIG9wZXJhdGlvbgojZGVmaW5lIFdQQUxfRkxPT1JfRElWKCBfYSwgX2IgKSAoICggKF9hKSAtICggKF9hKSAlIChfYikgKSApIC8gKF9iKSApCgojZGVmaW5lIFdQQUxfU1dBUF9VMTYoX3gpIFwKICAgKCAoICggKF94KSA8PCA4ICkgJiAweEZGMDAgKSB8ICggKCAoX3gpID4+IDggKSAmIDB4MDBGRiApICkKCiNkZWZpbmUgV1BBTF9TV0FQX1UzMihfeCkgXAogICgoICggKCAoX3gpIDw8IDI0ICkgJiAweEZGMDAwMDAwICkgfCAoICggKF94KSA+PiAyNCApICYgMHgwMDAwMDBGRiApICkgfCBcCiAgICggKCAoIChfeCkgPDwgOCApICYgMHgwMEZGMDAwMCApIHwgKCAoIChfeCkgPj4gOCApICYgMHgwMDAwRkYwMCApICkpCgovLyBFbmRpYW4gb3BlcmF0aW9ucyBmb3IgQmlnIEVuZGlhbiBhbmQgU21hbGwgRW5kaWFuIG1vZGVzCiNpZm5kZWYgQU5JX0JJR19CWVRFX0VORElBTgoKLy9UaGlzIHBvcnRpb24gaXMgZm9yIGxpdHRsZS1lbmRpYW4gY3B1CiNkZWZpbmUgV1BBTF9DUFVfVE9fQkUzMihfeCkgV1BBTF9TV0FQX1UzMihfeCkKI2RlZmluZSBXUEFMX0JFMzJfVE9fQ1BVKF94KSBXUEFMX1NXQVBfVTMyKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMTYoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCiNkZWZpbmUgV1BBTF9CRTE2X1RPX0NQVShfeCkgV1BBTF9TV0FQX1UxNihfeCkKI2RlZmluZSBXUEFMX0NQVV9UT19MRTMyKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9MRTMyX1RPX0NQVShfeCkgKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMTYoX3gpIChfeCkKI2RlZmluZSBXUEFMX0xFMTZfVE9fQ1BVKF94KSAoX3gpCgojZWxzZSAvLyNpZm5kZWYgQU5JX0JJR19CWVRFX0VORElBTgoKLy9UaGlzIHBvcnRpb24gaXMgZm9yIGJpZy1lbmRpYW4gY3B1CiNkZWZpbmUgV1BBTF9DUFVfVE9fQkUzMihfeCkgKF94KQojZGVmaW5lIFdQQUxfQkUzMl9UT19DUFUoX3gpIChfeCkKI2RlZmluZSBXUEFMX0NQVV9UT19CRTE2KF94KSAoX3gpCiNkZWZpbmUgV1BBTF9CRTE2X1RPX0NQVShfeCkgKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMzIoX3gpIFdQQUxfU1dBUF9VMzIoX3gpCiNkZWZpbmUgV1BBTF9MRTMyX1RPX0NQVShfeCkgV1BBTF9TV0FQX1UzMihfeCkKI2RlZmluZSBXUEFMX0NQVV9UT19MRTE2KF94KSBXUEFMX1NXQVBfVTE2KF94KQojZGVmaW5lIFdQQUxfTEUxNl9UT19DUFUoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCgojZW5kaWYgLy8jaWZuZGVmIEFOSV9CSUdfQllURV9FTkRJQU4KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqR2VuZXJpYyBBUEkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE9wZW4gLSAgSW5pdGlhbGl6ZSBQQUwKICAgIFBhcmFtOiAKICAgICAgIHBwUGFsQ29udGV4dCCWIHBvaW50ZXIgdG8gYSBjYWxsZXIgYWxsb2NhdGVkIHBvaW50ZXIuIEl0IGlzIG9wYXF1ZSB0byBjYWxsZXIuCiAgICAgICAgICAgICAgICAgICAgICBDYWxsZXIgc2F2ZSB0aGUgcmV0dXJuZWQgcG9pbnRlciBmb3IgZnV0dXJlIHVzZSB3aGVuIGNhbGxpbmcKICAgICAgICAgICAgICAgICAgICAgIFBBTCBBUElzLiBJZiB0aGlzIGlzIE5VTEwsIGl0IG1lYW5zIHRoYXQgUEFMIGRvZXNuJ3QgbmVlZCBpdC4KICAgICAgIGRldkhhbmRsZSAtIHBvaW50ZXIgdG8gdGhlIE9TIHNwZWNpZmljIGRldmljZSBoYW5kbGUKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxPcGVuKHZvaWQgKipwcFBhbENvbnRleHQsIHZvaWQgKmRldkhhbmRsZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbENsb3NlIC0gUmVsZWFzZSBQQUwKICAgIFBhcmFtOiAKICAgICAgIHBQYWxDb250ZXh0IJYgcG9pbnRlciByZXR1cm5lZCBmcm9tIHdwYWxPcGVuLgogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gT3RoZXJ3aXNlIGZhaWwuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbENsb3NlKHZvaWQgKnBQYWxDb250ZXh0KTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqTWVtb3J5IEFQSSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWZkZWYgTUVNT1JZX0RFQlVHCi8qIEZvciBNZW1vcnkgRGVidWdnaW5nLCBIb29rIHVwIFBBTCBtZW1vcnkgQVBJIHRvIFZPUyBtZW1vcnkgQVBJICovCiNkZWZpbmUgd3BhbE1lbW9yeUFsbG9jYXRlIHZvc19tZW1fbWFsbG9jCiNkZWZpbmUgd3BhbE1lbW9yeUZyZWUgICAgIHZvc19tZW1fZnJlZQojZWxzZQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlBbGxvY2F0ZSAtICBBbGxvY2F0ZSBtZW1vcnkKICAgIFBhcmFtOiAKICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKICAgIFJldHVybjoKICAgICAgIEEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gCiAgICAgICBOVUxMIJYgZmFpbCB0byBhbGxvY2F0ZSBtZW1vcnkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCAqd3BhbE1lbW9yeUFsbG9jYXRlKHdwdF91aW50MzIgc2l6ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeUZyZWUgLSAgRnJlZSBhbGxvY2F0ZWQgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBwdiCWIHBvaW50ZXIgdG8gYnVmZmVyIHRvIGJlIGZyZWVkCiAgICBSZXR1cm46CiAgICAgICBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbE1lbW9yeUZyZWUodm9pZCAqcHYpOwojZW5kaWYgLyogTUVNT1JZX0RFQlVHICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeUNvcHkgLSAgY29weSBtZW1vcnkKICAgIFBhcmFtOiAKICAgICAgIGRlc3QgliBhZGRyZXNzIHdoaWNoIGRhdGEgaXMgY29waWVkIHRvCiAgICAgICBzcmMgliBhZGRyZXNzIHdoaWNoIGRhdGEgaXMgY29waWVkIGZyb20KICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTCiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX0lOVkFMSURfUEFSQU0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsTWVtb3J5Q29weSh2b2lkICogZGVzdCwgdm9pZCAqIHNyYywgd3B0X3VpbnQzMiBzaXplKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeUNvbXBhcmUgLSAgY29tcGFyZSBtZW1vcnkKICAgIFBhcmFtOiAKICAgICAgIGJ1ZjEgliBhZGRyZXNzIG9mIGJ1ZmZlcjEKICAgICAgIGJ1ZjIgliBhZGRyZXNzIG9mIGJ1ZmZlcjIKICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1RSVUUgliBpZiB0d28gYnVmZmVycyBoYXZlIHNhbWUgY29udGVudAogICAgICAgZVdMQU5fUEFMX0ZBTFNFIJYgbm90IG1hdGNoCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9ib29sZWFuIHdwYWxNZW1vcnlDb21wYXJlKHZvaWQgKiBidWYxLCB2b2lkICogYnVmMiwgd3B0X3VpbnQzMiBzaXplKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsTWVtb3J5WmVybyAtICBaZXJvIG1lbW9yeQogICAgUGFyYW06IAogICAgICAgYnVmIJYgYWRkcmVzcyBvZiBidWZmZXIgdG8gYmUgemVybwogICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB6ZXJvCiAgICBSZXR1cm46CiAgICAgICBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbE1lbW9yeVplcm8odm9pZCAqYnVmLCB3cHRfdWludDMyIHNpemUpOwoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsTWVtb3J5RmlsbCAtICBGaWxsIG1lbW9yeSB3aXRoIG9uZSBwYXR0ZXJuCiAgICBQYXJhbTogCiAgICAgICBidWYgliBhZGRyZXNzIG9mIGJ1ZmZlciB0byBiZSB6ZXJvCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIHplcm8KICAgICAgIGJGaWxsIC0gb25lIGJ5dGUgb2YgZGF0YSB0byBmaWxsIGluIChzaXplKSBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyCiAgICBSZXR1cm46CiAgICAgICBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhbE1lbW9yeUZpbGwodm9pZCAqYnVmLCB3cHRfdWludDMyIHNpemUsIHdwdF9ieXRlIGJGaWxsKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERtYU1lbW9yeUFsbG9jYXRlIC0gIEFsbG9jYXRlIG1lbW9yeSByZWFkeSBmb3IgRE1BLiBBbGlnbmVkIGF0IDQtYnl0ZQogICAgUGFyYW06IAogICAgICAgcFBhbENvbnRleHQgLSBQQUwgY29udGV4dCBwb2ludGVyCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCiAgICAgICBwcFBoeXNpY2FsQWRkciCWIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBpZiBhbGxvY2F0aW9uIHN1Y2NlZWRzCiAgICBSZXR1cm46CiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgKHZpcnR1YWwgYWRkcmVzcykuIAogICAgICAgTlVMTCCWIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCAqd3BhbERtYU1lbW9yeUFsbG9jYXRlKHdwdF91aW50MzIgc2l6ZSwgdm9pZCAqKnBwUGh5c2ljYWxBZGRyKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRG1hTWVtb3J5RnJlZSAtICBGcmVlIG1lbW9yeSByZWFkeSBmb3IgRE1BCiAgICBQYXJhbTogCiAgICAgICBwUGFsQ29udGV4dCAtIFBBTCBjb250ZXh0IHBvaW50ZXIKICAgICAgIHB2IJYgYWRkcmVzcyBmb3IgdGhlIGJ1ZmZlciB0byBiZSBmcmVlZAogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxEbWFNZW1vcnlGcmVlKHZvaWQgKnB2KTsKCgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEYmdSZWFkUmVnaXN0ZXIgLSAgUmVhZCByZWdpc3RlciBmcm9tIHRoZSBXaUZpIEJCIGNoaXAKICAgIFBhcmFtOiAKICAgICAgIHJlZ0FkZHIgLSByZWdpc3RlciBhZGRyZXNzCiAgICAgICBwcmVnVmFsdWUgLSByZXR1cm4gdmFsdWUgZnJvbSByZWdpc3RlciBpZiBzdWNjZXNzCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRGJnUmVhZFJlZ2lzdGVyKHdwdF91aW50MzIgcmVnQWRkciwgd3B0X3VpbnQzMiAqcHJlZ1ZhbHVlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRGJnV3JpdGVSZWdpc3RlciAtICBXcml0ZSBhIHZhbHVlIHRvIHRoZSByZWdpc3RlciBpbiB0aGUgV2lGaSBCQiBjaGlwCiAgICBQYXJhbTogCiAgICAgICByZWdBZGRyIC0gcmVnaXN0ZXIgYWRkcmVzcwogICAgICAgcmVnVmFsdWUgLSB2YWx1ZSB0byBiZSB3cml0dGVuCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVSZWdpc3Rlcih3cHRfdWludDMyIHJlZ0FkZHIsIHdwdF91aW50MzIgcmVnVmFsdWUpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEYmdSZWFkTWVtb3J5IC0gIFJlYWQgbWVtb3J5IGZyb20gV2lGaSBCQiBjaGlwIHNwYWNlCiAgICBQYXJhbTogCiAgICAgICBtZW1BZGRyIC0gYWRkcmVzcyBvZiBtZW1vcnkKICAgICAgIGJ1ZiAtIG91dHB1dCAKICAgICAgIGxlbiAtIGxlbmd0aCB0byBiZSByZWFkCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRGJnUmVhZE1lbW9yeSh3cHRfdWludDMyIG1lbUFkZHIsIHdwdF91aW50OCAqYnVmLCB3cHRfdWludDMyIGxlbik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERiZ1dyaXRlTWVtb3J5IC0gIFdyaXRlIGEgdmFsdWUgdG8gdGhlIG1lbW9yeSBpbiB0aGUgV2lGaSBCQiBjaGlwIHNwYWNlCiAgICBQYXJhbTogCiAgICAgICBtZW1BZGRyIC0gbWVtb3J5IGFkZHJlc3MKICAgICAgIGJ1ZiAtIHZsYXVlIHRvIGJlIHdyaXR0ZW4KICAgICAgIGxlbiAtIGxlbmd0aCBvZiBidWYKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHdoZW4gZXZlcnl0aGluZyBpcyBPSwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxEYmdXcml0ZU1lbW9yeSh3cHRfdWludDMyIG1lbUFkZHIsIHdwdF91aW50OCAqYnVmLCB3cHRfdWludDMyIGxlbik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERyaXZlclNodXRkb3duIC0gIFNodXRkb3duIFdMQU4gZHJpdmVyCgogICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyBzaHV0ZG93bicgdG8gc2h1dGRvd24gV0xBTiAKICAgIGRyaXZlciB3aGVuIFJpdmEgY3Jhc2hlcy4KCiAgICBQYXJhbTogCiAgICAgICBOb25lCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRHJpdmVyU2h1dGRvd24odm9pZCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERyaXZlclNodXRkb3duIC0gIFJlLWluaXQgV0xBTiBkcml2ZXIKCiAgICBUaGlzIEFQSSBpcyByZXF1aWVkIGJ5IFNTUiwgY2FsbCBpbiB0byAnVk9TIHJlLWluaXQnIHRvIHJlLWluaXQgV0xBTgogICAgZHJpdmVyLgoKICAgIFBhcmFtOiAKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHdoZW4gZXZlcnl0aGluZyBpcyBPSwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxEcml2ZXJSZUluaXQodm9pZCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFJpdmFTdWJ5c3RlbVJlc3RhcnQgLSAgSW5pdGlhdGUgUml2YSBTU1IKCiAgICBUaGlzIEFQSSBpcyBjYWxsZWQgYnkgV0xBTiBkcml2ZXIgdG8gaW5pdGlhdGUgUml2YSBTU1IKCiAgICBQYXJhbToKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHdoZW4gZXZlcnl0aGluZyBpcyBPSwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxSaXZhU3VieXN0ZW1SZXN0YXJ0KHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxXbGFuUmVsb2FkIC0gIEluaXRpYXRlIFdMQU4gRHJpdmVyIHJlbG9hZAoKICAgIFBhcmFtOgogICAgICAgTm9uZQogICAgUmV0dXJuOgogICAgICAgTk9ORQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxXbGFuUmVsb2FkKHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxXY25zc1Jlc2V0SW50ciAtICBUcmlnZ2VyIHRoZSByZXNldCBGSVEgdG8gUml2YQoKICAgIFBhcmFtOgogICAgICAgTm9uZQogICAgUmV0dXJuOgogICAgICAgTk9ORQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxXY25zc1Jlc2V0SW50cih2b2lkKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsV2Nuc3NJc1Byb250b0h3VmVyMyAtICBDaGVjayBmb3IgUHJvbnRvIHZlcjMgSFcKCiAgICBQYXJhbToKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIFRSVUUgaWYgUG9udG8gSHcgVmVyIDMKICAgICAgIFRoZXJlZm9yZSB1c2UgV1E2IGluc3RlYWQgb2YgV1EyMyBmb3IgVFggTG93L0hpZ2ggUHJpb3JpdHkgQ2hhbm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwppbnQgd3BhbFdjbnNzSXNQcm9udG9Id1ZlcjModm9pZCk7Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRndEdW1wUmVxIC0gIFRyaWdnZXIgdGhlIGR1bXAgY29tbWFuZHMgdG8gRmlybXdhcmUKCiAgICBQYXJhbToKICAgICAgIGNtZCAtICAgQ29tbWFuZCBOby4gdG8gZXhlY3V0ZQogICAgICAgYXJnMSAtICBhcmd1bWVudCAxIHRvIGNtZAogICAgICAgYXJnMiAtICBhcmd1bWVudCAyIHRvIGNtZAogICAgICAgYXJnMyAtICBhcmd1bWVudCAzIHRvIGNtZAogICAgICAgYXJnNCAtICBhcmd1bWVudCA0IHRvIGNtZAogICAgICAgYXN5bmMgLWFzeW5jaHJvbm91cyBldmVudC4gRG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbi4KICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRndEdW1wUmVxKHdwdF91aW50MzIgY21kLCB3cHRfdWludDMyIGFyZzEsIHdwdF91aW50MzIgYXJnMiwKICAgICAgICAgICAgICAgICAgICB3cHRfdWludDMyIGFyZzMsIHdwdF91aW50MzIgYXJnNCwgd3B0X2Jvb2xlYW4gYXN5bmMpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEZXZpY2VQYW5pYyAtICBUcmlnZ2VyIERldmljZSBQYW5pYwogICAgICAgVHJpZ2dlciBkZXZpY2UgcGFuaWMgdG8gaGVscCBkZWJ1ZwoKICAgIFBhcmFtOgogICAgICAgTk9ORQoKICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRGV2aWNlUGFuaWModm9pZCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbElzbG9nUEluUHJvZ3Jlc3MgLSAgY2FsbHMgdm9zIEFQSSB2b3NfaXNfbG9ncF9pbl9wcm9ncmVzcygpCgogICAgUGFyYW06CiAgICAgICBOT05FCiAgICBSZXR1cm46CiAgICAgICBTVEFUVVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwppbnQgIHdwYWxJc2xvZ1BJblByb2dyZXNzKHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxJc1NzclBhbmljT25GYWlsdXJlIC0gIGNhbGxzIHZvcyBBUEkgaXNTc3JQYW5pY09uRmFpbHVyZSgpCgogICAgUGFyYW06CiAgICAgICBOT05FCiAgICBSZXR1cm46CiAgICAgICBTVEFUVVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwppbnQgIHdwYWxJc1NzclBhbmljT25GYWlsdXJlKHZvaWQpOwoKaW50ICB3cGFsR2V0RHhlUmVwbGVuaXNoUlhUaW1lclZhbCh2b2lkKTsKaW50ICB3cGFsSXNEeGVTU1JFbmFibGUodm9pZCk7Cgp3cHRfdWludDggd3BhbElzRndMb2dnaW5nRW5hYmxlZCh2b2lkKTsKd3B0X3VpbnQ4IHdwYWxJc0Z3TG9nZ2luZ1N1cHBvcnRlZCh2b2lkKTsKd3B0X3VpbnQ4IHdwYWxJc0Z3RXZMb2dnaW5nRW5hYmxlZCh2b2lkKTsKYm9vbCB3cGFsSXNBcnBQa3Qodm9pZCAqcFBhY2tldCk7CnZvaWQgIHdwYWxVcGRhdGVUWEFycEZXZGVsaXZlcmVkU3RhdHModm9pZCk7CiNlbmRpZiAvLyBfX1dMQU5fUUNUX1BBTF9BUElfSAo=