LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUHJldmlvdXNseSBsaWNlbnNlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UgYnkgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogKgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvcgogKiBhbnkgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwKICogY29waWVzLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMCiAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpZiAhZGVmaW5lZCggX19XTEFOX1FDVF9QQUxfQVBJX0ggKQojZGVmaW5lIF9fV0xBTl9RQ1RfUEFMX0FQSV9ICgovKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgCiAgXGZpbGUgIHdsYW5fcWN0X3BhbF9hcGkuaAogIAogIFxicmllZiBkZWZpbmUgZ2VuZXJhbCBBUElzIFBBTCBleHBvcnRzLiB3cHQgPSAoV2xhbiBQYWwgVHlwZSkgd3BhbCA9IChXbGFuIFBBTCkKICAgICAgICAgICAgICAgCiAgIERlZmluaXRpb25zIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGVudAogIAogICBDb3B5cmlnaHQgMjAxMCAoYykgUXVhbGNvbW0sIEluY29ycG9yYXRlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIAogICBRdWFsY29tbSBDb25maWRlbnRpYWwgYW5kIFByb3ByaWV0YXJ5LgogIAogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaW5jbHVkZSAid2xhbl9xY3RfcGFsX3R5cGUuaCIKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF9zdGF0dXMuaCIKCiNpZmRlZiBNRU1PUllfREVCVUcKI2luY2x1ZGUgInZvc19tZW1vcnkuaCIKI2VuZGlmIC8qIE1FTU9SWV9ERUJVRyAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKk1BQ1JPKioqKioqKioqKioqKioqKioqKioqKi8KCi8vIG1hY3JvIHRvIGdldCBtYXhpbXVtIG9mIHR3byB2YWx1ZXMuCiNkZWZpbmUgV1BBTF9NQVgoIF94LCBfeSApICggKCAoX3gpID4gKF95KSApID8gKF94KSA6IChfeSkgKSAgCgovLyBtYWNybyB0byBnZXQgbWluaW11bSBvZiB0d28gdmFsdWVzCiNkZWZpbmUgV1BBTF9NSU4oIF94LCBfeSApICggKCAoX3gpIDwgKF95KSApID8gKF94KSA6IChfeSkgICkgIAoKLy8gbWFjcm8gdG8gZ2V0IHRoZSBjZWlsaW5nIG9mIGFuIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uLi4uCiNkZWZpbmUgV1BBTF9DRUlMX0RJViggX2EsIF9iICkgKCAwICE9IChfYSkgJSAoX2IpICkgPyAoIChfYSkgLyAoX2IpICsgMSApIDogKCAoX2EpIC8gKF9iKSApIAoKLy8gbWFjcm8gdG8gcmV0dXJuIHRoZSBmbG9vciBvZiBhbiBpbnRlZ2VyIGRpdmlzaW9uIG9wZXJhdGlvbgojZGVmaW5lIFdQQUxfRkxPT1JfRElWKCBfYSwgX2IgKSAoICggKF9hKSAtICggKF9hKSAlIChfYikgKSApIC8gKF9iKSApCgojZGVmaW5lIFdQQUxfU1dBUF9VMTYoX3gpIFwKICAgKCAoICggKF94KSA8PCA4ICkgJiAweEZGMDAgKSB8ICggKCAoX3gpID4+IDggKSAmIDB4MDBGRiApICkKCiNkZWZpbmUgV1BBTF9TV0FQX1UzMihfeCkgXAogICAoICggKCAoX3gpIDw8IDI0ICkgJiAweEZGMDAwMDAwICkgfCAoICggKF94KSA+PiAyNCApICYgMHgwMDAwMDBGRiApICkgfCBcCiAgICggKCAoIChfeCkgPDwgOCApICYgMHgwMEZGMDAwMCApIHwgKCAoIChfeCkgPj4gOCApICYgMHgwMDAwRkYwMCApICkKCi8vIEVuZGlhbiBvcGVyYXRpb25zIGZvciBCaWcgRW5kaWFuIGFuZCBTbWFsbCBFbmRpYW4gbW9kZXMKI2lmbmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCgovL1RoaXMgcG9ydGlvbiBpcyBmb3IgbGl0dGxlLWVuZGlhbiBjcHUKI2RlZmluZSBXUEFMX0NQVV9UT19CRTMyKF94KSBXUEFMX1NXQVBfVTMyKF94KQojZGVmaW5lIFdQQUxfQkUzMl9UT19DUFUoX3gpIFdQQUxfU1dBUF9VMzIoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fQkUxNihfeCkgV1BBTF9TV0FQX1UxNihfeCkKI2RlZmluZSBXUEFMX0JFMTZfVE9fQ1BVKF94KSBXUEFMX1NXQVBfVTE2KF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMzIoX3gpIChfeCkKI2RlZmluZSBXUEFMX0xFMzJfVE9fQ1BVKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fTEUxNihfeCkgKF94KQojZGVmaW5lIFdQQUxfTEUxNl9UT19DUFUoX3gpIChfeCkKCiNlbHNlIC8vI2lmbmRlZiBBTklfQklHX0JZVEVfRU5ESUFOCgovL1RoaXMgcG9ydGlvbiBpcyBmb3IgYmlnLWVuZGlhbiBjcHUKI2RlZmluZSBXUEFMX0NQVV9UT19CRTMyKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9CRTMyX1RPX0NQVShfeCkgKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0JFMTYoX3gpIChfeCkKI2RlZmluZSBXUEFMX0JFMTZfVE9fQ1BVKF94KSAoX3gpCiNkZWZpbmUgV1BBTF9DUFVfVE9fTEUzMihfeCkgV1BBTF9TV0FQX1UzMihfeCkKI2RlZmluZSBXUEFMX0xFMzJfVE9fQ1BVKF94KSBXUEFMX1NXQVBfVTMyKF94KQojZGVmaW5lIFdQQUxfQ1BVX1RPX0xFMTYoX3gpIFdQQUxfU1dBUF9VMTYoX3gpCiNkZWZpbmUgV1BBTF9MRTE2X1RPX0NQVShfeCkgV1BBTF9TV0FQX1UxNihfeCkKCiNlbmRpZiAvLyNpZm5kZWYgQU5JX0JJR19CWVRFX0VORElBTgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipHZW5lcmljIEFQSSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsT3BlbiAtICBJbml0aWFsaXplIFBBTAogICAgUGFyYW06IAogICAgICAgcHBQYWxDb250ZXh0IJYgcG9pbnRlciB0byBhIGNhbGxlciBhbGxvY2F0ZWQgcG9pbnRlci4gSXQgaXMgb3BhcXVlIHRvIGNhbGxlci4KICAgICAgICAgICAgICAgICAgICAgIENhbGxlciBzYXZlIHRoZSByZXR1cm5lZCBwb2ludGVyIGZvciBmdXR1cmUgdXNlIHdoZW4gY2FsbGluZwogICAgICAgICAgICAgICAgICAgICAgUEFMIEFQSXMuIElmIHRoaXMgaXMgTlVMTCwgaXQgbWVhbnMgdGhhdCBQQUwgZG9lc24ndCBuZWVkIGl0LgogICAgICAgcE9TQ29udGV4dCAtIFBvaW50ZXIgdG8gYSBjb250ZXh0IHRoYXQgaXMgT1Mgc3BlY2lmaWMuIFRoaXMgaXMgTlVMTCBpcyBhIAogICAgICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIFBBTCBkb2Vzbid0IHVzZSBpdCBmb3IgdGhhdCBPUy4KICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxPcGVuKHZvaWQgKipwcFBhbENvbnRleHQsIHZvaWQgKnBPU0NvbnRleHQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxDbG9zZSAtIFJlbGVhc2UgUEFMCiAgICBQYXJhbTogCiAgICAgICBwUGFsQ29udGV4dCCWIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSB3cGFsT3Blbi4KICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIE90aGVyd2lzZSBmYWlsLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxDbG9zZSh2b2lkICpwUGFsQ29udGV4dCk7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKk1lbW9yeSBBUEkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmZGVmIE1FTU9SWV9ERUJVRwovKiBGb3IgTWVtb3J5IERlYnVnZ2luZywgSG9vayB1cCBQQUwgbWVtb3J5IEFQSSB0byBWT1MgbWVtb3J5IEFQSSAqLwojZGVmaW5lIHdwYWxNZW1vcnlBbGxvY2F0ZSB2b3NfbWVtX21hbGxvYwojZGVmaW5lIHdwYWxNZW1vcnlGcmVlICAgICB2b3NfbWVtX2ZyZWUKI2Vsc2UKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsTWVtb3J5QWxsb2NhdGUgLSAgQWxsb2NhdGUgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCiAgICBSZXR1cm46CiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuIAogICAgICAgTlVMTCCWIGZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgKndwYWxNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlGcmVlIC0gIEZyZWUgYWxsb2NhdGVkIG1lbW9yeQogICAgUGFyYW06IAogICAgICAgcHYgliBwb2ludGVyIHRvIGJ1ZmZlciB0byBiZSBmcmVlZAogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlGcmVlKHZvaWQgKnB2KTsKI2VuZGlmIC8qIE1FTU9SWV9ERUJVRyAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlDb3B5IC0gIGNvcHkgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBkZXN0IJYgYWRkcmVzcyB3aGljaCBkYXRhIGlzIGNvcGllZCB0bwogICAgICAgc3JjIJYgYWRkcmVzcyB3aGljaCBkYXRhIGlzIGNvcGllZCBmcm9tCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUwogICAgICAgZVdMQU5fUEFMX1NUQVRVU19JTlZBTElEX1BBUkFNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbE1lbW9yeUNvcHkodm9pZCAqIGRlc3QsIHZvaWQgKiBzcmMsIHdwdF91aW50MzIgc2l6ZSk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxNZW1vcnlDb21wYXJlIC0gIGNvbXBhcmUgbWVtb3J5CiAgICBQYXJhbTogCiAgICAgICBidWYxIJYgYWRkcmVzcyBvZiBidWZmZXIxCiAgICAgICBidWYyIJYgYWRkcmVzcyBvZiBidWZmZXIyCiAgICAgICBzaXplIJYgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKICAgIFJldHVybjoKICAgICAgIGVXTEFOX1BBTF9UUlVFIJYgaWYgdHdvIGJ1ZmZlcnMgaGF2ZSBzYW1lIGNvbnRlbnQKICAgICAgIGVXTEFOX1BBTF9GQUxTRSCWIG5vdCBtYXRjaAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfYm9vbGVhbiB3cGFsTWVtb3J5Q29tcGFyZSh2b2lkICogYnVmMSwgdm9pZCAqIGJ1ZjIsIHdwdF91aW50MzIgc2l6ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeVplcm8gLSAgWmVybyBtZW1vcnkKICAgIFBhcmFtOiAKICAgICAgIGJ1ZiCWIGFkZHJlc3Mgb2YgYnVmZmVyIHRvIGJlIHplcm8KICAgICAgIHNpemUgliBudW1iZXIgb2YgYnl0ZXMgdG8gemVybwogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlaZXJvKHZvaWQgKmJ1Ziwgd3B0X3VpbnQzMiBzaXplKTsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbE1lbW9yeUZpbGwgLSAgRmlsbCBtZW1vcnkgd2l0aCBvbmUgcGF0dGVybgogICAgUGFyYW06IAogICAgICAgYnVmIJYgYWRkcmVzcyBvZiBidWZmZXIgdG8gYmUgemVybwogICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byB6ZXJvCiAgICAgICBiRmlsbCAtIG9uZSBieXRlIG9mIGRhdGEgdG8gZmlsbCBpbiAoc2l6ZSkgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgogICAgUmV0dXJuOgogICAgICAgTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2b2lkIHdwYWxNZW1vcnlGaWxsKHZvaWQgKmJ1Ziwgd3B0X3VpbnQzMiBzaXplLCB3cHRfYnl0ZSBiRmlsbCk7CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEbWFNZW1vcnlBbGxvY2F0ZSAtICBBbGxvY2F0ZSBtZW1vcnkgcmVhZHkgZm9yIERNQS4gQWxpZ25lZCBhdCA0LWJ5dGUKICAgIFBhcmFtOiAKICAgICAgIHBQYWxDb250ZXh0IC0gUEFMIGNvbnRleHQgcG9pbnRlcgogICAgICAgc2l6ZSCWIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQogICAgICAgcHBQaHlzaWNhbEFkZHIgliBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaWYgYWxsb2NhdGlvbiBzdWNjZWVkcwogICAgUmV0dXJuOgogICAgICAgQSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh2aXJ0dWFsIGFkZHJlc3MpLiAKICAgICAgIE5VTEwgliBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgKndwYWxEbWFNZW1vcnlBbGxvY2F0ZSh3cHRfdWludDMyIHNpemUsIHZvaWQgKipwcFBoeXNpY2FsQWRkcik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERtYU1lbW9yeUZyZWUgLSAgRnJlZSBtZW1vcnkgcmVhZHkgZm9yIERNQQogICAgUGFyYW06IAogICAgICAgcFBhbENvbnRleHQgLSBQQUwgY29udGV4dCBwb2ludGVyCiAgICAgICBwdiCWIGFkZHJlc3MgZm9yIHRoZSBidWZmZXIgdG8gYmUgZnJlZWQKICAgIFJldHVybjoKICAgICAgIE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsRG1hTWVtb3J5RnJlZSh2b2lkICpwdik7CgoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRGJnUmVhZFJlZ2lzdGVyIC0gIFJlYWQgcmVnaXN0ZXIgZnJvbSB0aGUgV2lGaSBCQiBjaGlwCiAgICBQYXJhbTogCiAgICAgICByZWdBZGRyIC0gcmVnaXN0ZXIgYWRkcmVzcwogICAgICAgcHJlZ1ZhbHVlIC0gcmV0dXJuIHZhbHVlIGZyb20gcmVnaXN0ZXIgaWYgc3VjY2VzcwogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1JlYWRSZWdpc3Rlcih3cHRfdWludDMyIHJlZ0FkZHIsIHdwdF91aW50MzIgKnByZWdWYWx1ZSk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbERiZ1dyaXRlUmVnaXN0ZXIgLSAgV3JpdGUgYSB2YWx1ZSB0byB0aGUgcmVnaXN0ZXIgaW4gdGhlIFdpRmkgQkIgY2hpcAogICAgUGFyYW06IAogICAgICAgcmVnQWRkciAtIHJlZ2lzdGVyIGFkZHJlc3MKICAgICAgIHJlZ1ZhbHVlIC0gdmFsdWUgdG8gYmUgd3JpdHRlbgogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1dyaXRlUmVnaXN0ZXIod3B0X3VpbnQzMiByZWdBZGRyLCB3cHRfdWludDMyIHJlZ1ZhbHVlKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsRGJnUmVhZE1lbW9yeSAtICBSZWFkIG1lbW9yeSBmcm9tIFdpRmkgQkIgY2hpcCBzcGFjZQogICAgUGFyYW06IAogICAgICAgbWVtQWRkciAtIGFkZHJlc3Mgb2YgbWVtb3J5CiAgICAgICBidWYgLSBvdXRwdXQgCiAgICAgICBsZW4gLSBsZW5ndGggdG8gYmUgcmVhZAogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERiZ1JlYWRNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEYmdXcml0ZU1lbW9yeSAtICBXcml0ZSBhIHZhbHVlIHRvIHRoZSBtZW1vcnkgaW4gdGhlIFdpRmkgQkIgY2hpcCBzcGFjZQogICAgUGFyYW06IAogICAgICAgbWVtQWRkciAtIG1lbW9yeSBhZGRyZXNzCiAgICAgICBidWYgLSB2bGF1ZSB0byBiZSB3cml0dGVuCiAgICAgICBsZW4gLSBsZW5ndGggb2YgYnVmCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRGJnV3JpdGVNZW1vcnkod3B0X3VpbnQzMiBtZW1BZGRyLCB3cHRfdWludDggKmJ1Ziwgd3B0X3VpbnQzMiBsZW4pOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEcml2ZXJTaHV0ZG93biAtICBTaHV0ZG93biBXTEFOIGRyaXZlcgoKICAgIFRoaXMgQVBJIGlzIHJlcXVpZWQgYnkgU1NSLCBjYWxsIGluIHRvICdWT1Mgc2h1dGRvd24nIHRvIHNodXRkb3duIFdMQU4gCiAgICBkcml2ZXIgd2hlbiBSaXZhIGNyYXNoZXMuCgogICAgUGFyYW06IAogICAgICAgTm9uZQogICAgUmV0dXJuOgogICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gd2hlbiBldmVyeXRoaW5nIGlzIE9LCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbERyaXZlclNodXRkb3duKHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxEcml2ZXJTaHV0ZG93biAtICBSZS1pbml0IFdMQU4gZHJpdmVyCgogICAgVGhpcyBBUEkgaXMgcmVxdWllZCBieSBTU1IsIGNhbGwgaW4gdG8gJ1ZPUyByZS1pbml0JyB0byByZS1pbml0IFdMQU4KICAgIGRyaXZlci4KCiAgICBQYXJhbTogCiAgICAgICBOb25lCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsRHJpdmVyUmVJbml0KHZvaWQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxSaXZhU3VieXN0ZW1SZXN0YXJ0IC0gIEluaXRpYXRlIFJpdmEgU1NSCgogICAgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IFdMQU4gZHJpdmVyIHRvIGluaXRpYXRlIFJpdmEgU1NSCgogICAgUGFyYW06CiAgICAgICBOb25lCiAgICBSZXR1cm46CiAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSB3aGVuIGV2ZXJ5dGhpbmcgaXMgT0sKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsUml2YVN1YnlzdGVtUmVzdGFydCh2b2lkKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsV2xhblJlbG9hZCAtICBJbml0aWF0ZSBXTEFOIERyaXZlciByZWxvYWQKCiAgICBQYXJhbToKICAgICAgIE5vbmUKICAgIFJldHVybjoKICAgICAgIE5PTkUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFsV2xhblJlbG9hZCh2b2lkKTsKI2VuZGlmIC8vIF9fV0xBTl9RQ1RfUEFMX0FQSV9ICg==