LyoKICogQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgRnJhbudvaXMgR291Z2V0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxycGMuaD4KI2luY2x1ZGUgPHJwY25kci5oPgoKI2lmbmRlZiBfT0JKQkFTRV9IXwojZGVmaW5lIF9PQkpCQVNFX0hfCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTWFjcm9zIHRvIGRlZmluZSBhIENPTSBpbnRlcmZhY2UKICovCi8qCiAqIFRoZSBnb2FsIG9mIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGRlZmluaXRpb25zIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gdXNlIHRoZSBzYW1lCiAqIGhlYWRlciBmaWxlIGRlZmluaXRpb25zIHRvIHByb3ZpZGUgYm90aCBhIEMgaW50ZXJmYWNlIGFuZCBhIEMrKyBvYmplY3Qgb3JpZW50ZWQKICogaW50ZXJmYWNlIHRvIENPTSBpbnRlcmZhY2VzLiBUaGUgdHlwZSBvZiBpbnRlcmZhY2UgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseQogKiBkZXBlbmRpbmcgb24gdGhlIGxhbmd1YWdlIGJ1dCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8gZ2V0IHRoZSBDIGludGVyZmFjZSBpbiBDKysKICogYnkgZGVmaW5pbmcgQ0lOVEVSRkFDRS4KICoKICogSXQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICogIC0gYWxsIENPTSBpbnRlcmZhY2VzIGRlcml2ZSBmcm9tIElVbmtub3duLCB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLgogKiAgLSB0aGUgaGVhZGVyIGZpbGUgb25seSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UsIHRoZSBhY3R1YWwgZmllbGRzIGFyZSBkZWZpbmVkCiAqICAgIHNlcGFyYXRlbHkgaW4gdGhlIEMgZmlsZSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZS4KICoKICogVGhlIG5hdHVyYWwgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtIHdvdWxkIGJlIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYSBDKysgY2xhc3MgYW5kCiAqIHZpcnR1YWwgbWV0aG9kcyBpbiBDKysgYW5kIGEgc3RydWN0dXJlIHdpdGggYSB0YWJsZSBvZiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBpbiBDLgogKiBVbmZvcnR1bmF0ZWx5IHRoZSBsYXlvdXQgb2YgdGhlIHZpcnR1YWwgdGFibGUgaXMgY29tcGlsZXIgc3BlY2lmaWMsIHRoZSBsYXlvdXQgb2YKICogZysrIHZpcnR1YWwgdGFibGVzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGF0IG9mIGFuIGVnY3MgdmlydHVhbCB0YWJsZSB3aGljaCBpcyBub3QgdGhlCiAqIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgVmlzdWFsIEMrLiBUaGVyZSBhcmUgd29ya2Fyb3VuZHMgdG8gbWFrZSB0aGUgdmlydHVhbCB0YWJsZXMKICogY29tcGF0aWJsZSB2aWEgcGFkZGluZyBidXQgdW5mb3J0dW5hdGVseSB0aGUgb25lIHdoaWNoIGlzIGltcG9zZWQgdG8gdGhlIFdJTkUgZW11bGF0b3IKICogYnkgdGhlIFdpbmRvd3MgYmluYXJpZXMsIGkuZS4gdGhlIFZpc3VhbCBDKysgb25lLCBpcyB0aGUgbW9zdCBjb21wYWN0IG9mIGFsbC4KICoKICogU28gdGhlIHNvbHV0aW9uIEkgZmluYWxseSBhZG9wdGVkIGRvZXMgbm90IHVzZSB2aXJ0dWFsIHRhYmxlcy4gSW5zdGVhZCBJIHVzZSBpbmxpbmUKICogbm9uIHZpcnR1YWwgbWV0aG9kcyB0aGF0IGRlcmVmZXJlbmNlIHRoZSBtZXRob2QgcG9pbnRlciB0aGVtc2VsdmVzIGFuZCBwZXJmb3JtIHRoZSBjYWxsLgogKgogKiBMZXQncyB0YWtlIERpcmVjdDNEIGFzIGFuIGV4YW1wbGU6CiAqCiAqICAgICNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRAogKiAgICBERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNELElVbmtub3duKQogKiAgICB7CiAqICAgICAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRF8oSFJFU1VMVCxRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlELCB2b2lkKiopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsKICogICAgICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsKICogICAgICAgIC8vICoqKiBJRGlyZWN0M0QgbWV0aG9kcyAqKiogLy8KICogICAgICAgIFNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBSRUZJSUQpIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoRW51bURldmljZXMpKFRISVNfIExQRDNERU5VTURFVklDRVNDQUxMQkFDSywgTFBWT0lEKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKENyZWF0ZUxpZ2h0KShUSElTXyBMUERJUkVDVDNETElHSFQgKiwgSVVua25vd24gKikgUFVSRTsKICogICAgICAgIFNURE1FVEhPRChDcmVhdGVNYXRlcmlhbCkoVEhJU18gTFBESVJFQ1QzRE1BVEVSSUFMICosIElVbmtub3duICopIFBVUkU7CiAqICAgICAgICBTVERNRVRIT0QoQ3JlYXRlVmlld3BvcnQpKFRISVNfIExQRElSRUNUM0RWSUVXUE9SVCAqLCBJVW5rbm93biAqKSBQVVJFOwogKiAgICAgICAgU1RETUVUSE9EKEZpbmREZXZpY2UpKFRISVNfIExQRDNERklORERFVklDRVNFQVJDSCwgTFBEM0RGSU5EREVWSUNFUkVTVUxUKSBQVVJFOwogKiAgICB9OwogKiAgICAjdW5kZWYgSU5URVJGQUNFCiAqCiAqICAgICNpZmRlZiBDT0JKTUFDUk9TCiAqICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9BZGRSZWYocCkgICAgICAgICAgICAgKHApLT5scFZ0YmwtPkFkZFJlZihwKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9SZWxlYXNlKHApICAgICAgICAgICAgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkKICogICAgLy8gKioqIElEaXJlY3QzRCBtZXRob2RzICoqKiAvLwogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9Jbml0aWFsaXplKHAsYSkgICAgICAgKHApLT5scFZ0YmwtPkluaXRpYWxpemUocCxhKQogKiAgICAjZGVmaW5lIElEaXJlY3QzRF9FbnVtRGV2aWNlcyhwLGEsYikgICAgKHApLT5scFZ0YmwtPkVudW1EZXZpY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZUxpZ2h0KHAsYSxiKSAgICAocCktPmxwVnRibC0+Q3JlYXRlTGlnaHQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZU1hdGVyaWFsKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlTWF0ZXJpYWwocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0NyZWF0ZVZpZXdwb3J0KHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlVmlld3BvcnQocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0ZpbmREZXZpY2UocCxhLGIpICAgICAocCktPmxwVnRibC0+RmluZERldmljZShwLGEsYikKICogICAgI2VuZGlmCiAqCiAqIENvbW1lbnRzOgogKiAgLSBUaGUgSU5URVJGQUNFIG1hY3JvIGlzIHVzZWQgaW4gdGhlIFNURE1FVEhPRCBtYWNyb3MgdG8gZGVmaW5lIHRoZSB0eXBlIG9mIHRoZSAndGhpcycKICogICAgcG9pbnRlci4gRGVmaW5pbmcgdGhpcyBtYWNybyBoZXJlIHNhdmVzIHVzIHRoZSB0cm91YmxlIG9mIGhhdmluZyB0byByZXBlYXQgdGhlIGludGVyZmFjZQogKiAgICBuYW1lIGV2ZXJ5d2hlcmUuIE5vdGUgaG93ZXZlciB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSBtYWNyb3Mgd29yaywgYSBtYWNybyBsaWtlIFNURE1FVEhPRAogKiAgICBjYW5ub3QgdXNlICdJTlRFUkZBQ0UjI19WVEFCTEUnIGJlY2F1c2UgdGhpcyB3b3VsZCBnaXZlICdJTlRFUkZBQ0VfVlRBQkxFJyBhbmQgbm90CiAqICAgICdJRGlyZWN0M0RfVlRBQkxFJy4KICogIC0gVGhlIERFQ0xBUkVfSU5URVJGQUNFIGRlY2xhcmVzIGFsbCB0aGUgc3RydWN0dXJlcyBuZWNlc3NhcnkgZm9yIHRoZSBpbnRlcmZhY2UuIFdlIGhhdmUgdG8KICogICAgZXhwbGljaXRseSB1c2UgdGhlIGludGVyZmFjZSBuYW1lIGZvciBtYWNybyBleHBhbnNpb24gcmVhc29ucyBhZ2Fpbi4gSXQgZGVmaW5lcyB0aGUgbGlzdCBvZgogKiAgICBtZXRob2RzIHRoYXQgYXJlIGluaGVyaXRhYmxlIGZyb20gdGhpcyBpbnRlcmZhY2UuIEl0IG11c3QgYmUgd3JpdHRlbiBtYW51YWxseSAocmF0aGVyIHRoYW4KICogICAgdXNpbmcgYSBtYWNybyB0byBnZW5lcmF0ZSB0aGUgZXF1aXZhbGVudCBjb2RlKSB0byBhdm9pZCBtYWNybyByZWN1cnNpb24gKHdoaWNoIGNvbXBpbGVycwogKiAgICBkb24ndCBsaWtlKS4gSXQgbXVzdCBzdGFydCB3aXRoIHRoZSBtZXRob2RzIGRlZmluaXRpb24gb2YgdGhlIHBhcmVudCBpbnRlcmZhY2Ugc28gdGhhdAogKiAgICBtZXRob2QgaW5oZXJpdGFuY2Ugd29ya3MgcHJvcGVybHkuCiAqICAtIFRoZSAndW5kZWYgSU5URVJGQUNFJyBpcyBoZXJlIHRvIHJlbWluZCB5b3UgdGhhdCB1c2luZyBJTlRFUkZBQ0UgaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MKICogICAgd2lsbCBub3Qgd29yay4KICogIC0gRmluYWxseSB0aGUgc2V0IG9mICdJRGlyZWN0M0RfWHh4JyBtYWNyb3MgaXMgYSBzdGFuZGFyZCBzZXQgb2YgbWFjcm9zIGRlZmluZWQgdG8gZWFzZSBhY2Nlc3MKICogICAgdG8gdGhlIGludGVyZmFjZSBtZXRob2RzIGluIEMuIFVuZm9ydHVuYXRlbHkgSSBkb24ndCBzZWUgYW55IHdheSB0byBhdm9pZCBoYXZpbmcgdG8gZHVwbGljYXRlCiAqICAgIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGRlZmluaXRpb25zIHRoZXJlLiBUaGlzIHRpbWUgSSBjb3VsZCBoYXZlIHVzZWQgYSB0cmljayB0byB1c2Ugb25seSBvbmUKICogICAgbWFjcm8gd2hhdGV2ZXIgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGJ1dCBJIHByZWZlcnJlZCB0byBoYXZlIGl0IHdvcmsgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLgogKiAgLSBZb3UgcHJvYmFibHkgaGF2ZSBub3RpY2VkIHRoYXQgd2UgZG9uJ3QgZGVmaW5lIHRoZSBmaWVsZHMgd2UgbmVlZCB0byBhY3R1YWxseSBpbXBsZW1lbnQgdGhpcwogKiAgICBpbnRlcmZhY2U6IHJlZmVyZW5jZSBjb3VudCwgcG9pbnRlciB0byBvdGhlciByZXNvdXJjZXMgYW5kIG1pc2NlbGxhbmVvdXMgZmllbGRzLiBUaGF0J3MKICogICAgYmVjYXVzZSB0aGVzZSBpbnRlcmZhY2VzIGFyZSBqdXN0IHRoYXQ6IGludGVyZmFjZXMuIFRoZXkgbWF5IGJlIGltcGxlbWVudGVkIG1vcmUgdGhhbiBvbmNlLCBpbgogKiAgICBkaWZmZXJlbnQgY29udGV4dHMgYW5kIHNvbWV0aW1lcyBub3QgZXZlbiBpbiBXaW5lLiBUaHVzIGl0IHdvdWxkIG5vdCBtYWtlIHNlbnNlIHRvIGltcG9zZQogKiAgICB0aGF0IHRoZSBpbnRlcmZhY2UgY29udGFpbnMgc29tZSBzcGVjaWZpYyBmaWVsZHMuCiAqCiAqCiAqIEluIEMgdGhpcyBnaXZlczoKICogICAgdHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVnRibCBJRGlyZWN0M0RWdGJsOwogKiAgICBzdHJ1Y3QgSURpcmVjdDNEIHsKICogICAgICAgIElEaXJlY3QzRFZ0YmwqIGxwVnRibDsKICogICAgfTsKICogICAgc3RydWN0IElEaXJlY3QzRFZ0YmwgewogKiAgICAgICAgSFJFU1VMVCAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHZPYmopOwogKiAgICAgICAgVUxPTkcgKCpRdWVyeUludGVyZmFjZSkoSURpcmVjdDNEKiBtZSk7CiAqICAgICAgICBVTE9ORyAoKlF1ZXJ5SW50ZXJmYWNlKShJRGlyZWN0M0QqIG1lKTsKICogICAgICAgIEhSRVNVTFQgKCpJbml0aWFsaXplKShJRGlyZWN0M0QqIG1lLCBSRUZJSUQgYSk7CiAqICAgICAgICBIUkVTVUxUICgqRW51bURldmljZXMpKElEaXJlY3QzRCogbWUsIExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYik7CiAqICAgICAgICBIUkVTVUxUICgqQ3JlYXRlTGlnaHQpKElEaXJlY3QzRCogbWUsIExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpOwogKiAgICAgICAgSFJFU1VMVCAoKkNyZWF0ZU1hdGVyaWFsKShJRGlyZWN0M0QqIG1lLCBMUERJUkVDVDNETUFURVJJQUwqIGEsIElVbmtub3duKiBiKTsKICogICAgICAgIEhSRVNVTFQgKCpDcmVhdGVWaWV3cG9ydCkoSURpcmVjdDNEKiBtZSwgTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYik7CiAqICAgICAgICBIUkVTVUxUICgqRmluZERldmljZSkoSURpcmVjdDNEKiBtZSwgTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKTsKICogICAgfTsKICoKICogICAgI2lmZGVmIENPQkpNQUNST1MKICogICAgLy8gKioqIElVbmtub3duIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0FkZFJlZihwKSAgICAgICAgICAgICAocCktPmxwVnRibC0+QWRkUmVmKHApCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX1JlbGVhc2UocCkgICAgICAgICAgICAocCktPmxwVnRibC0+UmVsZWFzZShwKQogKiAgICAvLyAqKiogSURpcmVjdDNEIG1ldGhvZHMgKioqIC8vCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0luaXRpYWxpemUocCxhKSAgICAgICAocCktPmxwVnRibC0+SW5pdGlhbGl6ZShwLGEpCiAqICAgICNkZWZpbmUgSURpcmVjdDNEX0VudW1EZXZpY2VzKHAsYSxiKSAgICAocCktPmxwVnRibC0+RW51bURldmljZShwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTGlnaHQocCxhLGIpICAgIChwKS0+bHBWdGJsLT5DcmVhdGVMaWdodChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlTWF0ZXJpYWwocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVNYXRlcmlhbChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfQ3JlYXRlVmlld3BvcnQocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVWaWV3cG9ydChwLGEsYikKICogICAgI2RlZmluZSBJRGlyZWN0M0RfRmluZERldmljZShwLGEsYikgICAgIChwKS0+bHBWdGJsLT5GaW5kRGV2aWNlKHAsYSxiKQogKiAgICAjZW5kaWYKICoKICogQ29tbWVudHM6CiAqICAtIElEaXJlY3QzRCBvbmx5IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgSURpcmVjdDNEIHZpcnR1YWwvanVtcCB0YWJsZS4gVGhpcyBpcyB0aGUgb25seSB0aGluZwogKiAgICB0aGUgdXNlciBuZWVkcyB0byBrbm93IHRvIHVzZSB0aGUgaW50ZXJmYWNlLiBPZiBjb3Vyc2UgdGhlIHN0cnVjdHVyZSB3ZSB3aWxsIGRlZmluZSB0bwogKiAgICBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2Ugd2lsbCBoYXZlIG1vcmUgZmllbGRzIGJ1dCB0aGUgZmlyc3Qgb25lIHdpbGwgbWF0Y2ggdGhpcyBwb2ludGVyLgogKiAgLSBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgREVDTEFSRV9JTlRFUkZBQ0UgZGVmaW5lcyBib3RoIHRoZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBpbnRlcmZhY2UgYW5kCiAqICAgIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBqdW1wIHRhYmxlLgogKiAgLSBFYWNoIG1ldGhvZCBpcyBkZWNsYXJlZCBhcyBhIHBvaW50ZXIgdG8gZnVuY3Rpb24gZmllbGQgaW4gdGhlIGp1bXAgdGFibGUuIFRoZSBpbXBsZW1lbnRhdGlvbgogKiAgICB3aWxsIGZpbGwgdGhpcyBqdW1wIHRhYmxlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWVzLCBwcm9iYWJseSB1c2luZyBhIHN0YXRpYyB2YXJpYWJsZSwgYW5kCiAqICAgIGluaXRpYWxpemUgdGhlIGxwVnRibCBmaWVsZCB0byBwb2ludCB0byB0aGlzIHZhcmlhYmxlLgogKiAgLSBUaGUgSURpcmVjdDNEX1h4eCBtYWNyb3MgdGhlbiBqdXN0IGRlcmVmZW5jZSB0aGUgbHBWdGJsIHBvaW50ZXIgYW5kIHVzZSB0aGUgZnVuY3Rpb24gcG9pbnRlcgogKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWNybyBuYW1lLiBUaGlzIGVtdWxhdGVzIHRoZSBiZWhhdmlvciBvZiBhIHZpcnR1YWwgdGFibGUgYW5kIHNob3VsZCBiZQogKiAgICBqdXN0IGFzIGZhc3QuCiAqICAtIFRoaXMgQyBjb2RlIHNob3VsZCBiZSBxdWl0ZSBjb21wYXRpYmxlIHdpdGggdGhlIFdpbmRvd3MgaGVhZGVycyBib3RoIGZvciBjb2RlIHRoYXQgdXNlcyBDT00KICogICAgaW50ZXJmYWNlcyBhbmQgZm9yIGNvZGUgaW1wbGVtZW50aW5nIGEgQ09NIGludGVyZmFjZS4KICoKICoKICogQW5kIGluIEMrKyAod2l0aCBnY2MncyBnKyspOgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0Q6IHB1YmxpYyBJVW5rbm93biB7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgSW5pdGlhbGl6ZShSRUZJSUQgYSkgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIEVudW1EZXZpY2VzKExQRDNERU5VTURFVklDRVNDQUxMQkFDSyBhLCBMUFZPSUQgYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIENyZWF0ZUxpZ2h0KExQRElSRUNUM0RMSUdIVCogYSwgSVVua25vd24qIGIpID0gMDsKICogICAgICAgIHZpcnR1YWwgSFJFU1VMVCBDcmVhdGVNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwqIGEsIElVbmtub3duKiBiKSA9IDA7CiAqICAgICAgICB2aXJ0dWFsIEhSRVNVTFQgQ3JlYXRlVmlld3BvcnQoTFBESVJFQ1QzRFZJRVdQT1JUKiBhLCBJVW5rbm93biogYikgPSAwOwogKiAgICAgICAgdmlydHVhbCBIUkVTVUxUIEZpbmREZXZpY2UoTFBEM0RGSU5EREVWSUNFU0VBUkNIIGEsIExQRDNERklORERFVklDRVJFU1VMVCBiKSA9IDA7CiAqICAgIH07CiAqCiAqIENvbW1lbnRzOgogKiAgLSBPZiBjb3Vyc2UgaW4gQysrIHdlIHVzZSBpbmhlcml0YW5jZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZHVwbGljYXRlIHRoZSBtZXRob2QgZGVmaW5pdGlvbnMuCiAqICAtIEZpbmFsbHkgdGhlcmUgaXMgbm8gSURpcmVjdDNEX1h4eCBtYWNyby4gVGhlc2UgYXJlIG5vdCBuZWVkZWQgaW4gQysrIHVubGVzcyB0aGUgQ0lOVEVSRkFDRQogKiAgICBtYWNybyBpcyBkZWZpbmVkIGluIHdoaWNoIGNhc2Ugd2Ugd291bGQgbm90IGJlIGhlcmUuCiAqCiAqCiAqIEltcGxlbWVudGluZyBhIENPTSBpbnRlcmZhY2UuCiAqCiAqIFRoaXMgY29udGludWVzIHRoZSBhYm92ZSBleGFtcGxlLiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBDLgogKgogKiAgICB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RJbXBsIHsKICogICAgICAgIHZvaWQqIGxwVnRibDsKICogICAgICAgIC8vIC4uLgogKgogKiAgICB9IElEaXJlY3QzREltcGw7CiAqCiAqICAgIHN0YXRpYyBJRGlyZWN0M0RWdGJsIGQzZHZ0OwogKgogKiAgICAvLyBpbXBsZW1lbnQgdGhlIElEaXJlY3QzRCBtZXRob2RzIGhlcmUKICoKICogICAgaW50IElEaXJlY3QzRF9RdWVyeUludGVyZmFjZShJRGlyZWN0M0QqIG1lKQogKiAgICB7CiAqICAgICAgICBJRGlyZWN0M0RJbXBsICpUaGlzID0gKElEaXJlY3QzREltcGwgKiltZTsKICogICAgICAgIC8vIC4uLgogKiAgICB9CiAqCiAqICAgIC8vIC4uLgogKgogKiAgICBzdGF0aWMgSURpcmVjdDNEVnRibCBkM2R2dCA9IHsKICogICAgICAgIElEaXJlY3QzRF9RdWVyeUludGVyZmFjZSwKICogICAgICAgIElEaXJlY3QzRF9BZGQsCiAqICAgICAgICBJRGlyZWN0M0RfQWRkMiwKICogICAgICAgIElEaXJlY3QzRF9Jbml0aWFsaXplLAogKiAgICAgICAgSURpcmVjdDNEX1NldFdpZHRoCiAqICAgIH07CiAqCiAqIENvbW1lbnRzOgogKiAgLSBXZSBmaXJzdCBkZWZpbmUgd2hhdCB0aGUgaW50ZXJmYWNlIHJlYWxseSBjb250YWlucy4gVGhpcyBpcyB0aGUgSURpcmVjdDNESW1wbCBzdHJ1Y3R1cmUuIFRoZQogKiAgICBmaXJzdCBmaWVsZCBtdXN0IG9mIGNvdXJzZSBiZSB0aGUgdmlydHVhbCB0YWJsZSBwb2ludGVyLiBFdmVyeXRoaW5nIGVsc2UgaXMgZnJlZS4KICogIC0gVGhlbiB3ZSBwcmVkZWNsYXJlIG91ciBzdGF0aWMgdmlydHVhbCB0YWJsZSB2YXJpYWJsZSwgd2Ugd2lsbCBuZWVkIGl0cyBhZGRyZXNzIGluIHNvbWUKICogICAgbWV0aG9kcyB0byBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIgb2YgdGhlIHJldHVybmVkIGludGVyZmFjZSBvYmplY3RzLgogKiAgLSBUaGVuIHdlIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIG1ldGhvZHMuIFRvIG1hdGNoIHdoYXQgaGFzIGJlZW4gZGVjbGFyZWQgaW4gdGhlIGhlYWRlciBmaWxlCiAqICAgIHRoZXkgbXVzdCB0YWtlIGEgcG9pbnRlciB0byBhbiBJRGlyZWN0M0Qgc3RydWN0dXJlIGFuZCB3ZSBtdXN0IGNhc3QgaXQgdG8gYW4gSURpcmVjdDNESW1wbCBzbwogKiAgICB0aGF0IHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBmaWVsZHMuCiAqICAtIEZpbmFsbHkgd2UgaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCB0YWJsZS4KICovCgojaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoQ0lOVEVSRkFDRSkKCi8qIEMrKyBpbnRlcmZhY2UgKi8KCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgICAgICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERNRVRIT0RfKHR5cGUsbWV0aG9kKSAgdmlydHVhbCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRFYobWV0aG9kKSAgICAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EVkNBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRFZfKHR5cGUsbWV0aG9kKSB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EVkNBTExUWVBFIG1ldGhvZAoKI2RlZmluZSBQVVJFICAgPSAwCiNkZWZpbmUgVEhJU18KI2RlZmluZSBUSElTICAgdm9pZAoKI2RlZmluZSBpbnRlcmZhY2Ugc3RydWN0CiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpICAgICAgICBpbnRlcmZhY2UgaWZhY2UKI2RlZmluZSBERUNMQVJFX0lOVEVSRkFDRV8oaWZhY2UsaWJhc2UpIGludGVyZmFjZSBpZmFjZSA6IHB1YmxpYyBpYmFzZQoKI2RlZmluZSBCRUdJTl9JTlRFUkZBQ0UKI2RlZmluZSBFTkRfSU5URVJGQUNFCgojZWxzZSAgLyogX19jcGx1c3BsdXMgJiYgIUNJTlRFUkZBQ0UgKi8KCi8qIEMgaW50ZXJmYWNlICovCgojZGVmaW5lIFNURE1FVEhPRChtZXRob2QpICAgICAgICBIUkVTVUxUIChTVERNRVRIT0RDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRob2QpICB0eXBlIChTVERNRVRIT0RDQUxMVFlQRSAqbWV0aG9kKQojZGVmaW5lIFNURE1FVEhPRFYobWV0aG9kKSAgICAgICBIUkVTVUxUIChTVERNRVRIT0RWQ0FMTFRZUEUgKm1ldGhvZCkKI2RlZmluZSBTVERNRVRIT0RWXyh0eXBlLG1ldGhvZCkgdHlwZSAoU1RETUVUSE9EVkNBTExUWVBFICptZXRob2QpCgojZGVmaW5lIFBVUkUKI2RlZmluZSBUSElTXyBJTlRFUkZBQ0UgKlRoaXMsCiNkZWZpbmUgVEhJUyAgSU5URVJGQUNFICpUaGlzCgojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKCiNpZmRlZiBfX1dJTkVTUkNfXwojZGVmaW5lIENPTlNUX1ZUQUJMRQojZW5kaWYKCiNpZmRlZiBDT05TVF9WVEFCTEUKI3VuZGVmIENPTlNUX1ZUQkwKI2RlZmluZSBDT05TVF9WVEJMIGNvbnN0CiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpIFwKICAgICAgICAgdHlwZWRlZiBpbnRlcmZhY2UgaWZhY2UgeyBjb25zdCBzdHJ1Y3QgaWZhY2UjI1Z0YmwgKmxwVnRibDsgfSBpZmFjZTsgXAogICAgICAgICB0eXBlZGVmIHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2Vsc2UKI3VuZGVmIENPTlNUX1ZUQkwKI2RlZmluZSBDT05TVF9WVEJMCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0UoaWZhY2UpIFwKICAgICAgICAgdHlwZWRlZiBpbnRlcmZhY2UgaWZhY2UgeyBzdHJ1Y3QgaWZhY2UjI1Z0YmwgKmxwVnRibDsgfSBpZmFjZTsgXAogICAgICAgICB0eXBlZGVmIHN0cnVjdCBpZmFjZSMjVnRibCBpZmFjZSMjVnRibDsgXAogICAgICAgICBzdHJ1Y3QgaWZhY2UjI1Z0YmwKI2VuZGlmCiNkZWZpbmUgREVDTEFSRV9JTlRFUkZBQ0VfKGlmYWNlLGliYXNlKSBERUNMQVJFX0lOVEVSRkFDRShpZmFjZSkKCiNkZWZpbmUgQkVHSU5fSU5URVJGQUNFCiNkZWZpbmUgRU5EX0lOVEVSRkFDRQoKI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAmJiAhQ0lOVEVSRkFDRSAqLwoKI2lmbmRlZiBfX0lScGNTdHViQnVmZmVyX0ZXRF9ERUZJTkVEX18KI2RlZmluZSBfX0lScGNTdHViQnVmZmVyX0ZXRF9ERUZJTkVEX18KdHlwZWRlZiBpbnRlcmZhY2UgSVJwY1N0dWJCdWZmZXIgSVJwY1N0dWJCdWZmZXI7CiNlbmRpZgojaWZuZGVmIF9fSVJwY0NoYW5uZWxCdWZmZXJfRldEX0RFRklORURfXwojZGVmaW5lIF9fSVJwY0NoYW5uZWxCdWZmZXJfRldEX0RFRklORURfXwp0eXBlZGVmIGludGVyZmFjZSBJUnBjQ2hhbm5lbEJ1ZmZlciBJUnBjQ2hhbm5lbEJ1ZmZlcjsKI2VuZGlmCgojaW5jbHVkZSA8b2JqaWRsLmg+CgojaWZuZGVmIFJDX0lOVk9LRUQKLyogRm9yIGNvbXBhdGliaWxpdHkgb25seSwgYXQgbGVhc3QgZm9yIG5vdyAqLwojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmbmRlZiBJTklUR1VJRAojaW5jbHVkZSA8Y2d1aWQuaD4KI2VuZGlmCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2lmbmRlZiBOT05BTUVMRVNTU1RSVUNUCiNkZWZpbmUgTElTZXQzMihsaSwgdikgICAoKGxpKS5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkuTG93UGFydCA9ICh2KSkKI2RlZmluZSBVTElTZXQzMihsaSwgdikgICgobGkpLkhpZ2hQYXJ0ID0gMCwgKGxpKS5Mb3dQYXJ0ID0gKHYpKQojZWxzZQojZGVmaW5lIExJU2V0MzIobGksIHYpICAgKChsaSkudS5IaWdoUGFydCA9ICh2KSA8IDAgPyAtMSA6IDAsIChsaSkudS5Mb3dQYXJ0ID0gKHYpKQojZGVmaW5lIFVMSVNldDMyKGxpLCB2KSAgKChsaSkudS5IaWdoUGFydCA9IDAsIChsaSkudS5Mb3dQYXJ0ID0gKHYpKQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTdGFuZGFyZCBBUEkKICovCkRXT1JEIFdJTkFQSSBDb0J1aWxkVmVyc2lvbih2b2lkKTsKCnR5cGVkZWYgZW51bSB0YWdDT0lOSVQKewogICAgQ09JTklUX0FQQVJUTUVOVFRIUkVBREVEICA9IDB4MiwgLyogQXBhcnRtZW50IG1vZGVsICovCiAgICBDT0lOSVRfTVVMVElUSFJFQURFRCAgICAgID0gMHgwLCAvKiBPTEUgY2FsbHMgb2JqZWN0cyBvbiBhbnkgdGhyZWFkICovCiAgICBDT0lOSVRfRElTQUJMRV9PTEUxRERFICAgID0gMHg0LCAvKiBEb24ndCB1c2UgRERFIGZvciBPbGUxIHN1cHBvcnQgKi8KICAgIENPSU5JVF9TUEVFRF9PVkVSX01FTU9SWSAgPSAweDggIC8qIFRyYWRlIG1lbW9yeSBmb3Igc3BlZWQgKi8KfSBDT0lOSVQ7CgpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemUoTFBWT0lEIGxwUmVzZXJ2ZWQpOwpIUkVTVUxUIFdJTkFQSSBDb0luaXRpYWxpemVFeChMUFZPSUQgbHBSZXNlcnZlZCwgRFdPUkQgZHdDb0luaXQpOwp2b2lkIFdJTkFQSSBDb1VuaW5pdGlhbGl6ZSh2b2lkKTsKRFdPUkQgV0lOQVBJIENvR2V0Q3VycmVudFByb2Nlc3Modm9pZCk7CgpISU5TVEFOQ0UgV0lOQVBJIENvTG9hZExpYnJhcnkoTFBPTEVTVFIgbHBzekxpYk5hbWUsIEJPT0wgYkF1dG9GcmVlKTsKdm9pZCBXSU5BUEkgQ29GcmVlQWxsTGlicmFyaWVzKHZvaWQpOwp2b2lkIFdJTkFQSSBDb0ZyZWVMaWJyYXJ5KEhJTlNUQU5DRSBoTGlicmFyeSk7CnZvaWQgV0lOQVBJIENvRnJlZVVudXNlZExpYnJhcmllcyh2b2lkKTsKCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlSW5zdGFuY2UoUkVGQ0xTSUQgcmNsc2lkLCBMUFVOS05PV04gcFVua091dGVyLCBEV09SRCBkd0Nsc0NvbnRleHQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29DcmVhdGVJbnN0YW5jZUV4KFJFRkNMU0lEICAgICAgcmNsc2lkLAoJCQkJICBMUFVOS05PV04gICAgIHBVbmtPdXRlciwKCQkJCSAgRFdPUkQgICAgICAgICBkd0Nsc0NvbnRleHQsCgkJCQkgIENPU0VSVkVSSU5GTyogcFNlcnZlckluZm8sCgkJCQkgIFVMT05HICAgICAgICAgY21xLAoJCQkJICBNVUxUSV9RSSogICAgIHBSZXN1bHRzKTsKCkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tRmlsZShDT1NFUlZFUklORk8qIHBTZXJ2ZXJJbmZvLCBDTFNJRCogcENsc2lkLCBJVW5rbm93biogcHVua091dGVyLCBEV09SRCBkd0Nsc0N0eCwgRFdPUkQgZ3JmTW9kZSwgT0xFQ0hBUiogcHdzek5hbWUsIERXT1JEIGR3Q291bnQsIE1VTFRJX1FJKiBwUmVzdWx0cyk7CkhSRVNVTFQgV0lOQVBJIENvR2V0SW5zdGFuY2VGcm9tSVN0b3JhZ2UoQ09TRVJWRVJJTkZPKiBwU2VydmVySW5mbywgQ0xTSUQqIHBDbHNpZCwgSVVua25vd24qIHB1bmtPdXRlciwgRFdPUkQgZHdDbHNDdHgsIElTdG9yYWdlKiBwc3RnLCBEV09SRCBkd0NvdW50LCBNVUxUSV9RSSogcFJlc3VsdHMpOwoKSFJFU1VMVCBXSU5BUEkgQ29HZXRNYWxsb2MoRFdPUkQgZHdNZW1Db250ZXh0LCBMUE1BTExPQyogbHBNYWxsb2MpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbUFsbG9jKFVMT05HIHNpemUpOwp2b2lkIFdJTkFQSSBDb1Rhc2tNZW1GcmVlKExQVk9JRCBwdHIpOwpMUFZPSUQgV0lOQVBJIENvVGFza01lbVJlYWxsb2MoTFBWT0lEIHB0ciwgVUxPTkcgc2l6ZSk7CgpIUkVTVUxUIFdJTkFQSSBDb1JlZ2lzdGVyTWFsbG9jU3B5KExQTUFMTE9DU1BZIHBNYWxsb2NTcHkpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZU1hbGxvY1NweSh2b2lkKTsKCi8qIGNsYXNzIHJlZ2lzdHJhdGlvbiBmbGFnczsgcGFzc2VkIHRvIENvUmVnaXN0ZXJDbGFzc09iamVjdCAqLwp0eXBlZGVmIGVudW0gdGFnUkVHQ0xTCnsKICAgIFJFR0NMU19TSU5HTEVVU0UgPSAwLAogICAgUkVHQ0xTX01VTFRJUExFVVNFID0gMSwKICAgIFJFR0NMU19NVUxUSV9TRVBBUkFURSA9IDIsCiAgICBSRUdDTFNfU1VTUEVOREVEID0gNAp9IFJFR0NMUzsKCkhSRVNVTFQgV0lOQVBJIENvR2V0Q2xhc3NPYmplY3QoUkVGQ0xTSUQgcmNsc2lkLCBEV09SRCBkd0Nsc0NvbnRleHQsIENPU0VSVkVSSU5GTyAqcFNlcnZlckluZm8sIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29SZWdpc3RlckNsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxMUFVOS05PV04gcFVuayxEV09SRCBkd0Nsc0NvbnRleHQsRFdPUkQgZmxhZ3MsTFBEV09SRCBscGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb1Jldm9rZUNsYXNzT2JqZWN0KERXT1JEIGR3UmVnaXN0ZXIpOwpIUkVTVUxUIFdJTkFQSSBDb0dldFBTQ2xzaWQoUkVGSUlEIHJpaWQsQ0xTSUQgKnBjbHNpZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJQU0Nsc2lkKFJFRklJRCByaWlkLCBSRUZDTFNJRCByY2xzaWQpOwpIUkVTVUxUIFdJTkFQSSBDb1N1c3BlbmRDbGFzc09iamVjdHModm9pZCk7CkhSRVNVTFQgV0lOQVBJIENvUmVzdW1lQ2xhc3NPYmplY3RzKHZvaWQpOwpVTE9ORyBXSU5BUEkgQ29BZGRSZWZTZXJ2ZXJQcm9jZXNzKHZvaWQpOwpVTE9ORyBXSU5BUEkgQ29SZWxlYXNlU2VydmVyUHJvY2Vzcyh2b2lkKTsKCi8qIG1hcnNoYWxsaW5nICovCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlRnJlZVRocmVhZGVkTWFyc2hhbGVyKExQVU5LTk9XTiBwdW5rT3V0ZXIsIExQVU5LTk9XTiogcHB1bmtNYXJzaGFsKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRJbnRlcmZhY2VBbmRSZWxlYXNlU3RyZWFtKExQU1RSRUFNIHBTdG0sIFJFRklJRCBpaWQsIExQVk9JRCogcHB2KTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRNYXJzaGFsU2l6ZU1heChVTE9ORyogcHVsU2l6ZSwgUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRTdGFuZGFyZE1hcnNoYWwoUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBEV09SRCBkd0Rlc3RDb250ZXh0LCBMUFZPSUQgcHZEZXN0Q29udGV4dCwgRFdPUkQgbXNobGZsYWdzLCBMUE1BUlNIQUwqIHBwTWFyc2hhbCk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEhyZXN1bHQoTFBTVFJFQU0gcHN0bSwgSFJFU1VMVCBocmVzdWx0KTsKSFJFU1VMVCBXSU5BUEkgQ29NYXJzaGFsSW50ZXJmYWNlKExQU1RSRUFNIHBTdG0sIFJFRklJRCByaWlkLCBMUFVOS05PV04gcFVuaywgRFdPUkQgZHdEZXN0Q29udGV4dCwgTFBWT0lEIHB2RGVzdENvbnRleHQsIERXT1JEIG1zaGxmbGFncyk7CkhSRVNVTFQgV0lOQVBJIENvTWFyc2hhbEludGVyVGhyZWFkSW50ZXJmYWNlSW5TdHJlYW0oUkVGSUlEIHJpaWQsIExQVU5LTk9XTiBwVW5rLCBMUFNUUkVBTSogcHBTdG0pOwpIUkVTVUxUIFdJTkFQSSBDb1JlbGVhc2VNYXJzaGFsRGF0YShMUFNUUkVBTSBwU3RtKTsKSFJFU1VMVCBXSU5BUEkgQ29EaXNjb25uZWN0T2JqZWN0KExQVU5LTk9XTiBscFVuaywgRFdPUkQgcmVzZXJ2ZWQpOwpIUkVTVUxUIFdJTkFQSSBDb1VubWFyc2hhbEhyZXN1bHQoTFBTVFJFQU0gcHN0bSwgSFJFU1VMVCogcGhyZXN1bHQpOwpIUkVTVUxUIFdJTkFQSSBDb1VubWFyc2hhbEludGVyZmFjZShMUFNUUkVBTSBwU3RtLCBSRUZJSUQgcmlpZCwgTFBWT0lEKiBwcHYpOwpIUkVTVUxUIFdJTkFQSSBDb0xvY2tPYmplY3RFeHRlcm5hbChMUFVOS05PV04gcFVuaywgQk9PTCBmTG9jaywgQk9PTCBmTGFzdFVubG9ja1JlbGVhc2VzKTsKQk9PTCBXSU5BUEkgQ29Jc0hhbmRsZXJDb25uZWN0ZWQoTFBVTktOT1dOIHBVbmspOwoKLyogc2VjdXJpdHkgKi8KSFJFU1VMVCBXSU5BUEkgQ29Jbml0aWFsaXplU2VjdXJpdHkoUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNlY0Rlc2MsIExPTkcgY0F1dGhTdmMsIFNPTEVfQVVUSEVOVElDQVRJT05fU0VSVklDRSogYXNBdXRoU3ZjLCB2b2lkKiBwUmVzZXJ2ZWQxLCBEV09SRCBkd0F1dGhuTGV2ZWwsIERXT1JEIGR3SW1wTGV2ZWwsIHZvaWQqIHBSZXNlcnZlZDIsIERXT1JEIGR3Q2FwYWJpbGl0aWVzLCB2b2lkKiBwUmVzZXJ2ZWQzKTsKSFJFU1VMVCBXSU5BUEkgQ29HZXRDYWxsQ29udGV4dChSRUZJSUQgcmlpZCwgdm9pZCoqIHBwSW50ZXJmYWNlKTsKSFJFU1VMVCBXSU5BUEkgQ29RdWVyeUF1dGhlbnRpY2F0aW9uU2VydmljZXMoRFdPUkQqIHBjQXV0aFN2YywgU09MRV9BVVRIRU5USUNBVElPTl9TRVJWSUNFKiogYXNBdXRoU3ZjKTsKCkhSRVNVTFQgV0lOQVBJIENvUXVlcnlQcm94eUJsYW5rZXQoSVVua25vd24qIHBQcm94eSwgRFdPUkQqIHB3QXV0aG5TdmMsIERXT1JEKiBwQXV0aHpTdmMsIE9MRUNIQVIqKiBwU2VydmVyUHJpbmNOYW1lLCBEV09SRCogcEF1dGhuTGV2ZWwsIERXT1JEKiBwSW1wTGV2ZWwsIFJQQ19BVVRIX0lERU5USVRZX0hBTkRMRSogcEF1dGhJbmZvLCBEV09SRCogcENhcGFiaWxpdGVzKTsKSFJFU1VMVCBXSU5BUEkgQ29TZXRQcm94eUJsYW5rZXQoSVVua25vd24qIHBQcm94eSwgRFdPUkQgZHdBdXRoblN2YywgRFdPUkQgZHdBdXRoelN2YywgT0xFQ0hBUiogcFNlcnZlclByaW5jTmFtZSwgRFdPUkQgZHdBdXRobkxldmVsLCBEV09SRCBkd0ltcExldmVsLCBSUENfQVVUSF9JREVOVElUWV9IQU5ETEUgcEF1dGhJbmZvLCBEV09SRCBkd0NhcGFiaWxpdGllcyk7CkhSRVNVTFQgV0lOQVBJIENvQ29weVByb3h5KElVbmtub3duKiBwUHJveHksIElVbmtub3duKiogcHBDb3B5KTsKCkhSRVNVTFQgV0lOQVBJIENvSW1wZXJzb25hdGVDbGllbnQodm9pZCk7CkhSRVNVTFQgV0lOQVBJIENvUXVlcnlDbGllbnRCbGFua2V0KERXT1JEKiBwQXV0aG5TdmMsIERXT1JEKiBwQXV0aHpTdmMsIE9MRUNIQVIqKiBwU2VydmVyUHJpbmNOYW1lLCBEV09SRCogcEF1dGhuTGV2ZWwsIERXT1JEKiBwSW1wTGV2ZWwsIFJQQ19BVVRIWl9IQU5ETEUqIHBQcml2cywgRFdPUkQqIHBDYXBhYmlsaXRpZXMpOwpIUkVTVUxUIFdJTkFQSSBDb1JldmVydFRvU2VsZih2b2lkKTsKCi8qIG1pc2MgKi8KSFJFU1VMVCBXSU5BUEkgQ29HZXRUcmVhdEFzQ2xhc3MoUkVGQ0xTSUQgY2xzaWRPbGQsIExQQ0xTSUQgcENsc2lkTmV3KTsKSFJFU1VMVCBXSU5BUEkgQ29UcmVhdEFzQ2xhc3MoUkVGQ0xTSUQgY2xzaWRPbGQsIFJFRkNMU0lEIGNsc2lkTmV3KTsKCkhSRVNVTFQgV0lOQVBJIENvQ3JlYXRlR3VpZChHVUlEKiBwZ3VpZCk7CkJPT0wgV0lOQVBJIENvSXNPbGUxQ2xhc3MoUkVGQ0xTSUQgcmNsc2lkKTsKCkJPT0wgV0lOQVBJIENvRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKFdPUkQgbkRvc0RhdGUsIFdPUkQgbkRvc1RpbWUsIEZJTEVUSU1FKiBscEZpbGVUaW1lKTsKQk9PTCBXSU5BUEkgQ29GaWxlVGltZVRvRG9zRGF0ZVRpbWUoRklMRVRJTUUqIGxwRmlsZVRpbWUsIFdPUkQqIGxwRG9zRGF0ZSwgV09SRCogbHBEb3NUaW1lKTsKSFJFU1VMVCBXSU5BUEkgQ29GaWxlVGltZU5vdyhGSUxFVElNRSogbHBGaWxlVGltZSk7CkhSRVNVTFQgV0lOQVBJIENvUmVnaXN0ZXJNZXNzYWdlRmlsdGVyKExQTUVTU0FHRUZJTFRFUiBscE1lc3NhZ2VGaWx0ZXIsTFBNRVNTQUdFRklMVEVSICpscGxwTWVzc2FnZUZpbHRlcik7Cgp0eXBlZGVmIGVudW0gdGFnQ09XQUlUX0ZMQUdTCnsKICAgIENPV0FJVF9XQUlUQUxMICAgPSAweDAwMDAwMDAxLAogICAgQ09XQUlUX0FMRVJUQUJMRSA9IDB4MDAwMDAwMDIKfSBDT1dBSVRfRkxBR1M7CgpIUkVTVUxUIFdJTkFQSSBDb1dhaXRGb3JNdWx0aXBsZUhhbmRsZXMoRFdPUkQgZHdGbGFncyxEV09SRCBkd1RpbWVvdXQsVUxPTkcgY0hhbmRsZXMsY29uc3QgSEFORExFKiBwSGFuZGxlcyxMUERXT1JEIGxwZHdpbmRleCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJR1VJRCBBUEkKICovCkhSRVNVTFQgV0lOQVBJIFN0cmluZ0Zyb21DTFNJRChSRUZDTFNJRCBpZCwgTFBPTEVTVFIqKTsKSFJFU1VMVCBXSU5BUEkgQ0xTSURGcm9tU3RyaW5nKExQT0xFU1RSLCBDTFNJRCAqKTsKSFJFU1VMVCBXSU5BUEkgQ0xTSURGcm9tUHJvZ0lEKExQQ09MRVNUUiBwcm9naWQsIExQQ0xTSUQgcmlpZCk7CkhSRVNVTFQgV0lOQVBJIFByb2dJREZyb21DTFNJRChSRUZDTFNJRCBjbHNpZCwgTFBPTEVTVFIgKmxwbHBzelByb2dJRCk7CgpJTlQgV0lOQVBJIFN0cmluZ0Zyb21HVUlEMihSRUZHVUlEIGlkLCBMUE9MRVNUUiBzdHIsIElOVCBjbWF4KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglDT00gU2VydmVyIGRsbCAtIGV4cG9ydHMKICovCkhSRVNVTFQgV0lOQVBJIERsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdik7CkhSRVNVTFQgV0lOQVBJIERsbENhblVubG9hZE5vdyh2b2lkKTsKCi8qIHNob3VsZG4ndCBiZSBoZXJlLCBidXQgaXMgbmljZSBmb3IgdHlwZSBjaGVja2luZyAqLwojaWZkZWYgX19XSU5FU1JDX18KSFJFU1VMVCBXSU5BUEkgRGxsUmVnaXN0ZXJTZXJ2ZXIodm9pZCk7CkhSRVNVTFQgV0lOQVBJIERsbFVucmVnaXN0ZXJTZXJ2ZXIodm9pZCk7CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEYXRhIE9iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRGF0YUFkdmlzZUhvbGRlcihMUERBVEFBRFZJU0VIT0xERVIqIHBwREFIb2xkZXIpOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVEYXRhQ2FjaGUoTFBVTktOT1dOIHBVbmtPdXRlciwgUkVGQ0xTSUQgcmNsc2lkLCBSRUZJSUQgaWlkLCBMUFZPSUQqIHBwdik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJTW9uaWtlciBBUEkKICovCkhSRVNVTFQgV0lOQVBJIEJpbmRNb25pa2VyKExQTU9OSUtFUiBwbWssIERXT1JEIGdyZk9wdCwgUkVGSUlEIGlpZFJlc3VsdCwgTFBWT0lEKiBwcHZSZXN1bHQpOwpIUkVTVUxUIFdJTkFQSSBDb0dldE9iamVjdChMUENXU1RSIHBzek5hbWUsIEJJTkRfT1BUUyAqcEJpbmRPcHRpb25zLCBSRUZJSUQgcmlpZCwgdm9pZCAqKnBwdik7CkhSRVNVTFQgV0lOQVBJIENyZWF0ZUFudGlNb25pa2VyKExQTU9OSUtFUiAqIHBwbWspOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVCaW5kQ3R4KERXT1JEIHJlc2VydmVkLCBMUEJDKiBwcGJjKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlQ2xhc3NNb25pa2VyKFJFRkNMU0lEIHJjbHNpZCwgTFBNT05JS0VSKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlRmlsZU1vbmlrZXIoTFBDT0xFU1RSIGxwc3pQYXRoTmFtZSwgTFBNT05JS0VSKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlR2VuZXJpY0NvbXBvc2l0ZShMUE1PTklLRVIgcG1rRmlyc3QsIExQTU9OSUtFUiBwbWtSZXN0LCBMUE1PTklLRVIqIHBwbWtDb21wb3NpdGUpOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVJdGVtTW9uaWtlcihMUENPTEVTVFIgbHBzekRlbGltLCBMUENPTEVTVFIgIGxwc3pJdGVtLCBMUE1PTklLRVIqIHBwbWspOwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVPYmpyZWZNb25pa2VyKExQVU5LTk9XTiBwdW5rLCBMUE1PTklLRVIgKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgQ3JlYXRlUG9pbnRlck1vbmlrZXIoTFBVTktOT1dOIHB1bmssIExQTU9OSUtFUiAqIHBwbWspOwpIUkVTVUxUIFdJTkFQSSBHZXRDbGFzc0ZpbGUoTFBDT0xFU1RSIGZpbGVQYXRoTmFtZSxDTFNJRCAqcGNsc2lkKTsKSFJFU1VMVCBXSU5BUEkgR2V0UnVubmluZ09iamVjdFRhYmxlKERXT1JEIHJlc2VydmVkLCBMUFJVTk5JTkdPQkpFQ1RUQUJMRSAqcHByb3QpOwpIUkVTVUxUIFdJTkFQSSBNa1BhcnNlRGlzcGxheU5hbWUoTFBCQyBwYmMsIExQQ09MRVNUUiBzelVzZXJOYW1lLCBVTE9ORyAqIHBjaEVhdGVuLCBMUE1PTklLRVIgKiBwcG1rKTsKSFJFU1VMVCBXSU5BUEkgTW9uaWtlckNvbW1vblByZWZpeFdpdGgoSU1vbmlrZXIqIHBta1RoaXMsSU1vbmlrZXIqIHBta090aGVyLElNb25pa2VyKiogcHBta0NvbW1vbik7CkhSRVNVTFQgV0lOQVBJIE1vbmlrZXJSZWxhdGl2ZVBhdGhUbyhMUE1PTklLRVIgcG1rU3JjLCBMUE1PTklLRVIgcG1rRGVzdCwgTFBNT05JS0VSICogcHBta1JlbFBhdGgsIEJPT0wgZHdSZXNlcnZlZCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RvcmFnZSBBUEkKICovCiNkZWZpbmUgU1RHTV9ESVJFQ1QJCTB4MDAwMDAwMDAKI2RlZmluZSBTVEdNX1RSQU5TQUNURUQJCTB4MDAwMTAwMDAKI2RlZmluZSBTVEdNX1NJTVBMRQkJMHgwODAwMDAwMAojZGVmaW5lIFNUR01fUkVBRAkJMHgwMDAwMDAwMAojZGVmaW5lIFNUR01fV1JJVEUJCTB4MDAwMDAwMDEKI2RlZmluZSBTVEdNX1JFQURXUklURQkJMHgwMDAwMDAwMgojZGVmaW5lIFNUR01fU0hBUkVfREVOWV9OT05FCTB4MDAwMDAwNDAKI2RlZmluZSBTVEdNX1NIQVJFX0RFTllfUkVBRAkweDAwMDAwMDMwCiNkZWZpbmUgU1RHTV9TSEFSRV9ERU5ZX1dSSVRFCTB4MDAwMDAwMjAKI2RlZmluZSBTVEdNX1NIQVJFX0VYQ0xVU0lWRQkweDAwMDAwMDEwCiNkZWZpbmUgU1RHTV9QUklPUklUWQkJMHgwMDA0MDAwMAojZGVmaW5lIFNUR01fREVMRVRFT05SRUxFQVNFCTB4MDQwMDAwMDAKI2RlZmluZSBTVEdNX0NSRUFURQkJMHgwMDAwMTAwMAojZGVmaW5lIFNUR01fQ09OVkVSVAkJMHgwMDAyMDAwMAojZGVmaW5lIFNUR01fRkFJTElGVEhFUkUJMHgwMDAwMDAwMAojZGVmaW5lIFNUR01fTk9TQ1JBVENICQkweDAwMTAwMDAwCiNkZWZpbmUgU1RHTV9OT1NOQVBTSE9UCQkweDAwMjAwMDAwCiNkZWZpbmUgU1RHTV9ESVJFQ1RfU1dNUgkweDAwNDAwMDAwCgojZGVmaW5lIFNUR0ZNVF9TVE9SQUdFCQkwCiNkZWZpbmUgU1RHRk1UX0ZJTEUgCQkzCiNkZWZpbmUgU1RHRk1UX0FOWSAJCTQKI2RlZmluZSBTVEdGTVRfRE9DRklMRSAJNQoKdHlwZWRlZiBzdHJ1Y3QgdGFnU1RHT1BUSU9OUwp7CiAgICBVU0hPUlQgdXNWZXJzaW9uOwogICAgVVNIT1JUIHJlc2VydmVkOwogICAgVUxPTkcgdWxTZWN0b3JTaXplOwogICAgY29uc3QgV0NIQVIqIHB3Y3NUZW1wbGF0ZUZpbGU7Cn0gU1RHT1BUSU9OUzsKCkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGUoTFBDT0xFU1RSIHB3Y3NOYW1lLERXT1JEIGdyZk1vZGUsRFdPUkQgcmVzZXJ2ZWQsSVN0b3JhZ2UgKipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdDcmVhdGVTdG9yYWdlRXgoY29uc3QgV0NIQVIqLERXT1JELERXT1JELERXT1JELFNUR09QVElPTlMqLHZvaWQqLFJFRklJRCx2b2lkKiopOwpIUkVTVUxUIFdJTkFQSSBTdGdJc1N0b3JhZ2VGaWxlKExQQ09MRVNUUiBmbik7CkhSRVNVTFQgV0lOQVBJIFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0KTsKSFJFU1VMVCBXSU5BUEkgU3RnT3BlblN0b3JhZ2UoY29uc3QgT0xFQ0hBUiogcHdjc05hbWUsSVN0b3JhZ2UqIHBzdGdQcmlvcml0eSxEV09SRCBncmZNb2RlLFNOQiBzbmJFeGNsdWRlLERXT1JEIHJlc2VydmVkLElTdG9yYWdlKipwcHN0Z09wZW4pOwpIUkVTVUxUIFdJTkFQSSBTdGdPcGVuU3RvcmFnZUV4KGNvbnN0IFdDSEFSKiBwd2N3TmFtZSxEV09SRCBncmZNb2RlLERXT1JEIHN0Z2ZtdCxEV09SRCBncmZBdHRycyxTVEdPUFRJT05TICpwU3RnT3B0aW9ucywgdm9pZCAqcmVzZXJ2ZWQsIFJFRklJRCByaWlkLCB2b2lkICoqcHBPYmplY3RPcGVuKTsKCkhSRVNVTFQgV0lOQVBJIFN0Z0NyZWF0ZURvY2ZpbGVPbklMb2NrQnl0ZXMoSUxvY2tCeXRlcyAqcGxrYnl0LERXT1JEIGdyZk1vZGUsIERXT1JEIHJlc2VydmVkLCBJU3RvcmFnZSoqIHBwc3RnT3Blbik7CkhSRVNVTFQgV0lOQVBJIFN0Z09wZW5TdG9yYWdlT25JTG9ja0J5dGVzKElMb2NrQnl0ZXMgKnBsa2J5dCwgSVN0b3JhZ2UgKnBzdGdQcmlvcml0eSwgRFdPUkQgZ3JmTW9kZSwgU05CIHNuYkV4Y2x1ZGUsIERXT1JEIHJlc2VydmVkLCBJU3RvcmFnZSAqKnBwc3RnT3Blbik7CkhSRVNVTFQgV0lOQVBJIFN0Z1NldFRpbWVzKCBPTEVDSEFSIGNvbnN0ICpscHN6TmFtZSwgRklMRVRJTUUgY29uc3QgKnBjdGltZSwgRklMRVRJTUUgY29uc3QgKnBhdGltZSwgRklMRVRJTUUgY29uc3QgKnBtdGltZSk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCi8qIEZJWE1FOiAjaW5jbHVkZSA8dXJsbW9uLmg+ICovCiNpbmNsdWRlIDxwcm9waWRsLmg+CgojaWZuZGVmIF9fV0lORVNSQ19fCgojZGVmaW5lIEZBUlNUUlVDVAojZGVmaW5lIEhVR0VQCgojZGVmaW5lIFdJTk9MRUFQSSAgICAgICAgU1REQVBJCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSBTVERBUElfKHR5cGUpCgojZW5kaWYgLyogX19XSU5FU1JDX18gKi8KCiNlbmRpZiAvKiBfT0JKQkFTRV9IXyAqLwo=