LyoKICpJRGlyZWN0M0RTd2FwQ2hhaW45IGltcGxlbWVudGF0aW9uCiAqCiAqQ29weXJpZ2h0IDIwMDItMjAwMyBKYXNvbiBFZG1lYWRlcwogKkNvcHlyaWdodCAyMDAyLTIwMDMgUmFwaGFlbCBKdW5xdWVpcmEKICpDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKkNvcHlyaWdodCAyMDA3IFN0ZWZhbiBE9nNpbmdlciBmb3IgQ29kZVdlYXZlcnMKICoKICpUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKkxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKnZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKlRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICpMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICpMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmVkM2RfcHJpdmF0ZS5oIgoKCi8qVE9ETzogc29tZSBvZiB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG1heSBiZSByZXF1aXJlZCB0bwogICAgc2V0IHRoZSBnYW1tYSByYW1wIChmb3Igc29tZSB3ZWlyZCByZWFzb24gbWljcm9zb2Z0IGhhdmUgbGVmdCBzd2FwIGdhbW1hcmFtcCBpbiBkZXZpY2UKICAgIGJ1dCBpdCBvcGVyYXRlcyBvbiBhIHN3YXBjaGFpbiwgaXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIG1vdmUgaXQgdG8gSVdpbmVEM0RTd2FwQ2hhaW4gZm9yIElXaW5lRDNEKSovCgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZDNkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoZnBzKTsKCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIFRoaXMtPndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8KCi8qIElEaXJlY3QzRFN3YXBDaGFpbiBJVW5rbm93biBwYXJ0cyBmb2xsb3c6ICovCnN0YXRpYyBVTE9ORyBXSU5BUEkgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX0FkZFJlZihJV2luZUQzRFN3YXBDaGFpbiAqaWZhY2UpIHsKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKilpZmFjZTsKICAgIERXT1JEIHJlZkNvdW50ID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7CiAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBpbmNyZWFzaW5nIGZyb20gJWRcbiIsIFRoaXMsIHJlZkNvdW50IC0gMSk7CiAgICByZXR1cm4gcmVmQ291bnQ7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzRFN3YXBDaGFpbkltcGxfUXVlcnlJbnRlcmZhY2UoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcG9iaikKewogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICpUaGlzID0gKElXaW5lRDNEU3dhcENoYWluSW1wbCAqKWlmYWNlOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIHBwb2JqKTsKICAgIGlmIChJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lVbmtub3duKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVdpbmVEM0RCYXNlKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVdpbmVEM0RTd2FwQ2hhaW4pKXsKICAgICAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfQWRkUmVmKGlmYWNlKTsKICAgICAgICBpZihwcG9iaiA9PSBOVUxMKXsKICAgICAgICAgICAgRVJSKCJRdWVyeSBpbnRlcmZhY2UgY2FsbGVkIGJ1dCBub3cgZGF0YSBhbGxvY2F0ZWRcbiIpOwogICAgICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKICAgICAgICB9CiAgICAgICAgKnBwb2JqID0gVGhpczsKICAgICAgICByZXR1cm4gV0lORUQzRF9PSzsKICAgIH0KICAgICpwcG9iaiA9IE5VTEw7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKCnN0YXRpYyBVTE9ORyBXSU5BUEkgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX1JlbGVhc2UoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlKSB7CiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGwgKlRoaXMgPSAoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopaWZhY2U7CiAgICBEV09SRCByZWZDb3VudDsKICAgIHJlZkNvdW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CiAgICBUUkFDRSgiKCVwKSA6IFJlbGVhc2VSZWYgdG8gJWRcbiIsIFRoaXMsIHJlZkNvdW50KTsKICAgIGlmIChyZWZDb3VudCA9PSAwKSB7CiAgICAgICAgSVdpbmVEM0RTd2FwQ2hhaW5fRGVzdHJveShpZmFjZSwgRDNEQ0JfRGVmYXVsdERlc3Ryb3lTdXJmYWNlKTsKICAgIH0KICAgIHJldHVybiByZWZDb3VudDsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRQYXJlbnQoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlLCBJVW5rbm93biAqKiBwcFBhcmVudCl7CiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGwgKlRoaXMgPSAoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopaWZhY2U7CiAgICAqcHBQYXJlbnQgPSBUaGlzLT5wYXJlbnQ7CiAgICBJVW5rbm93bl9BZGRSZWYoKnBwUGFyZW50KTsKICAgIFRSQUNFKCIoJXApIHJldHVybmluZyAlcFxuIiwgVGhpcyAsICpwcFBhcmVudCk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKLypJV2luZUQzRFN3YXBDaGFpbiBwYXJ0cyBmb2xsb3c6ICovCnN0YXRpYyB2b2lkIFdJTkFQSSBJV2luZUQzRFN3YXBDaGFpbkltcGxfRGVzdHJveShJV2luZUQzRFN3YXBDaGFpbiAqaWZhY2UsIEQzRENCX0RFU1RST1lTVVJGQUNFRk4gRDNEQ0JfRGVzdHJveVJlbmRlclRhcmdldCkgewogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICpUaGlzID0gKElXaW5lRDNEU3dhcENoYWluSW1wbCAqKWlmYWNlOwogICAgV0lORUQzRERJU1BMQVlNT0RFIG1vZGU7CiAgICBpbnQgaTsKCiAgICAvKiByZWxlYXNlIHRoZSByZWYgdG8gdGhlIGZyb250IGFuZCBiYWNrIGJ1ZmZlciBwYXJlbnRzICovCiAgICBpZihUaGlzLT5mcm9udEJ1ZmZlcikgewogICAgICAgIElXaW5lRDNEU3VyZmFjZV9TZXRDb250YWluZXIoVGhpcy0+ZnJvbnRCdWZmZXIsIDApOwogICAgICAgIGlmKEQzRENCX0Rlc3Ryb3lSZW5kZXJUYXJnZXQoVGhpcy0+ZnJvbnRCdWZmZXIpID4gMCkgewogICAgICAgICAgICBGSVhNRSgiKCVwKSBTb21ldGhpbmcncyBzdGlsbCBob2xkaW5nIHRoZSBmcm9udCBidWZmZXJcbiIsVGhpcyk7CiAgICAgICAgfQogICAgfQoKICAgIGlmKFRoaXMtPmJhY2tCdWZmZXIpIHsKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IoaSA9IDA7IGkgPCBUaGlzLT5wcmVzZW50UGFybXMuQmFja0J1ZmZlckNvdW50OyBpKyspIHsKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1NldENvbnRhaW5lcihUaGlzLT5iYWNrQnVmZmVyW2ldLCAwKTsKICAgICAgICAgICAgaWYoRDNEQ0JfRGVzdHJveVJlbmRlclRhcmdldChUaGlzLT5iYWNrQnVmZmVyW2ldKSA+IDApIHsKICAgICAgICAgICAgICAgIEZJWE1FKCIoJXApIFNvbWV0aGluZydzIHN0aWxsIGhvbGRpbmcgdGhlIGJhY2sgYnVmZmVyXG4iLFRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPmJhY2tCdWZmZXIpOwogICAgfQoKICAgIGZvcihpID0gMDsgaSA8IFRoaXMtPm51bV9jb250ZXh0czsgaSsrKSB7CiAgICAgICAgRGVzdHJveUNvbnRleHQoVGhpcy0+d2luZUQzRERldmljZSwgVGhpcy0+Y29udGV4dFtpXSk7CiAgICB9CiAgICAvKiBSZXN0b3JlIHRoZSBzY3JlZW4gcmVzb2x1dGlvbiBpZiB3ZSByZW5kZXJlZCBpbiBmdWxsc2NyZWVuCiAgICAgKiBUaGlzIHdpbGwgcmVzdG9yZSB0aGUgc2NyZWVuIHJlc29sdXRpb24gdG8gd2hhdCBpdCB3YXMgYmVmb3JlIGNyZWF0aW5nIHRoZSBzd2FwY2hhaW4uIEluIGNhc2Ugb2YgZDNkOCBhbmQgZDNkOQogICAgICogdGhpcyB3aWxsIGJlIHRoZSBvcmlnaW5hbCBkZXNrdG9wIHJlc29sdXRpb24uIEluIGNhc2Ugb2YgZDNkNyB0aGlzIHdpbGwgYmUgYSBOT1AgYmVjYXVzZSBkZHJhdyBzZXRzIHRoZSByZXNvbHV0aW9uCiAgICAgKiBiZWZvcmUgc3RhcnRpbmcgdXAgRGlyZWN0M0QsIHRodXMgb3JpZ193aWR0aCBhbmQgb3JpZ19oZWlnaHQgd2lsbCBiZSBlcXVhbCB0byB0aGUgbW9kZXMgaW4gdGhlIHByZXNlbnRhdGlvbiBwYXJhbXMKICAgICAqLwogICAgaWYoVGhpcy0+cHJlc2VudFBhcm1zLldpbmRvd2VkID09IEZBTFNFKSB7CiAgICAgICAgbW9kZS5XaWR0aCA9IFRoaXMtPm9yaWdfd2lkdGg7CiAgICAgICAgbW9kZS5IZWlnaHQgPSBUaGlzLT5vcmlnX2hlaWdodDsKICAgICAgICBtb2RlLlJlZnJlc2hSYXRlID0gMDsKICAgICAgICBtb2RlLkZvcm1hdCA9IFRoaXMtPm9yaWdfZm10OwogICAgICAgIElXaW5lRDNERGV2aWNlX1NldERpc3BsYXlNb2RlKChJV2luZUQzRERldmljZSAqKSBUaGlzLT53aW5lRDNERGV2aWNlLCAwLCAmbW9kZSk7CiAgICB9CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5jb250ZXh0KTsKCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9QcmVzZW50KElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgQ09OU1QgUkVDVCAqcFNvdXJjZVJlY3QsIENPTlNUIFJFQ1QgKnBEZXN0UmVjdCwgSFdORCBoRGVzdFdpbmRvd092ZXJyaWRlLCBDT05TVCBSR05EQVRBICpwRGlydHlSZWdpb24sIERXT1JEIGR3RmxhZ3MpIHsKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKilpZmFjZTsKICAgIHVuc2lnbmVkIGludCBzeW5jOwogICAgaW50IHJldHZhbDsKCgogICAgQWN0aXZhdGVDb250ZXh0KFRoaXMtPndpbmVEM0REZXZpY2UsIFRoaXMtPmJhY2tCdWZmZXJbMF0sIENUWFVTQUdFX1JFU09VUkNFTE9BRCk7CgogICAgLyogUmVuZGVyIHRoZSBjdXJzb3Igb250byB0aGUgYmFjayBidWZmZXIsIHVzaW5nIG91ciBuaWZ0eSBkaXJlY3RkcmF3IGJsaXR0aW5nIGNvZGUgOi0pICovCiAgICBpZihUaGlzLT53aW5lRDNERGV2aWNlLT5iQ3Vyc29yVmlzaWJsZSAmJiBUaGlzLT53aW5lRDNERGV2aWNlLT5jdXJzb3JUZXh0dXJlKSB7CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlSW1wbCBjdXJzb3I7CiAgICAgICAgUkVDVCBkZXN0UmVjdCA9IHtUaGlzLT53aW5lRDNERGV2aWNlLT54U2NyZWVuU3BhY2UgLSBUaGlzLT53aW5lRDNERGV2aWNlLT54SG90U3BvdCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPndpbmVEM0REZXZpY2UtPnlTY3JlZW5TcGFjZSAtIFRoaXMtPndpbmVEM0REZXZpY2UtPnlIb3RTcG90LAogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+d2luZUQzRERldmljZS0+eFNjcmVlblNwYWNlICsgVGhpcy0+d2luZUQzRERldmljZS0+Y3Vyc29yV2lkdGggLSBUaGlzLT53aW5lRDNERGV2aWNlLT54SG90U3BvdCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPndpbmVEM0REZXZpY2UtPnlTY3JlZW5TcGFjZSArIFRoaXMtPndpbmVEM0REZXZpY2UtPmN1cnNvckhlaWdodCAtIFRoaXMtPndpbmVEM0REZXZpY2UtPnlIb3RTcG90fTsKICAgICAgICBUUkFDRSgiUmVuZGVyaW5nIHRoZSBjdXJzb3IuIENyZWF0aW5nIGZha2Ugc3VyZmFjZSBhdCAlcFxuIiwgJmN1cnNvcik7CiAgICAgICAgLyogQnVpbGQgYSBmYWtlIHN1cmZhY2UgdG8gY2FsbCB0aGUgQmxpdHRpbmcgY29kZS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgaW50ZXJmYWNlIHBhc3NlZCBieQogICAgICAgICAqIHRoZSBhcHBsaWNhdGlvbiBiZWNhdXNlIHdlIGFyZSBvbmx5IHN1cHBvc2VkIHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIG91dC4gVXNpbmcgYSBmYWtlIHN1cmZhY2UKICAgICAgICAgKiBhbGxvd3MgdG8gdXNlIHRoZSBCbGl0dGluZyBlbmdpbmUgYW5kIGF2b2lkIGNvcHlpbmcgdGhlIHdob2xlIHRleHR1cmUgLT4gcmVuZGVyIHRhcmdldCBibGl0dGluZyBjb2RlLgogICAgICAgICAqLwogICAgICAgIG1lbXNldCgmY3Vyc29yLCAwLCBzaXplb2YoY3Vyc29yKSk7CiAgICAgICAgY3Vyc29yLmxwVnRibCA9ICZJV2luZUQzRFN1cmZhY2VfVnRibDsKICAgICAgICBjdXJzb3IucmVzb3VyY2UucmVmID0gMTsKICAgICAgICBjdXJzb3IucmVzb3VyY2Uud2luZUQzRERldmljZSA9IFRoaXMtPndpbmVEM0REZXZpY2U7CiAgICAgICAgY3Vyc29yLnJlc291cmNlLnBvb2wgPSBXSU5FRDNEUE9PTF9TQ1JBVENIOwogICAgICAgIGN1cnNvci5yZXNvdXJjZS5mb3JtYXQgPSBXSU5FRDNERk1UX0E4UjhHOEI4OwogICAgICAgIGN1cnNvci5yZXNvdXJjZS5yZXNvdXJjZVR5cGUgPSBXSU5FRDNEUlRZUEVfU1VSRkFDRTsKICAgICAgICBjdXJzb3IuZ2xEZXNjcmlwdGlvbi50ZXh0dXJlTmFtZSA9IFRoaXMtPndpbmVEM0REZXZpY2UtPmN1cnNvclRleHR1cmU7CiAgICAgICAgY3Vyc29yLmdsRGVzY3JpcHRpb24udGFyZ2V0ID0gR0xfVEVYVFVSRV8yRDsKICAgICAgICBjdXJzb3IuZ2xEZXNjcmlwdGlvbi5sZXZlbCA9IDA7CiAgICAgICAgY3Vyc29yLmN1cnJlbnREZXNjLldpZHRoID0gVGhpcy0+d2luZUQzRERldmljZS0+Y3Vyc29yV2lkdGg7CiAgICAgICAgY3Vyc29yLmN1cnJlbnREZXNjLkhlaWdodCA9IFRoaXMtPndpbmVEM0REZXZpY2UtPmN1cnNvckhlaWdodDsKICAgICAgICBjdXJzb3IuZ2xSZWN0LmxlZnQgPSAwOwogICAgICAgIGN1cnNvci5nbFJlY3QudG9wID0gMDsKICAgICAgICBjdXJzb3IuZ2xSZWN0LnJpZ2h0ID0gY3Vyc29yLmN1cnJlbnREZXNjLldpZHRoOwogICAgICAgIGN1cnNvci5nbFJlY3QuYm90dG9tID0gY3Vyc29yLmN1cnJlbnREZXNjLkhlaWdodDsKICAgICAgICAvKiBUaGUgY3Vyc29yIG11c3QgaGF2ZSBwb3cyIHNpemVzICovCiAgICAgICAgY3Vyc29yLnBvdzJXaWR0aCA9IGN1cnNvci5jdXJyZW50RGVzYy5XaWR0aDsKICAgICAgICBjdXJzb3IucG93MkhlaWdodCA9IGN1cnNvci5jdXJyZW50RGVzYy5IZWlnaHQ7CiAgICAgICAgLyogVGhlIHN1cmZhY2UgaXMgaW4gdGhlIHRleHR1cmUgKi8KICAgICAgICBjdXJzb3IuRmxhZ3MgfD0gU0ZMQUdfSU5URVhUVVJFOwogICAgICAgIC8qIEREQkxUX0tFWVNSQyB3aWxsIGNhdXNlIEJsdE92ZXJyaWRlIHRvIGVuYWJsZSB0aGUgYWxwaGEgdGVzdCB3aXRoIEdMX05PVEVRVUFMLCAwLjAsCiAgICAgICAgICogd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQgOi0pCiAgICAgICAgICovCiAgICAgICAgaWYgKFRoaXMtPnByZXNlbnRQYXJtcy5XaW5kb3dlZCkgewogICAgICAgICAgICBNYXBXaW5kb3dQb2ludHMoTlVMTCwgVGhpcy0+d2luX2hhbmRsZSwgKExQUE9JTlQpJmRlc3RSZWN0LCAyKTsKICAgICAgICB9CiAgICAgICAgSVdpbmVEM0RTdXJmYWNlX0JsdChUaGlzLT5iYWNrQnVmZmVyWzBdLCAmZGVzdFJlY3QsIChJV2luZUQzRFN1cmZhY2UgKikgJmN1cnNvciwgTlVMTCwgV0lORUREQkxUX0tFWVNSQywgTlVMTCwgV0lORUQzRFRFWEZfTk9ORSk7CiAgICB9CiAgICBpZihUaGlzLT53aW5lRDNERGV2aWNlLT5sb2dvX3N1cmZhY2UpIHsKICAgICAgICAvKiBCbGl0IHRoZSBsb2dvIGludG8gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBkcmF3YWJsZSAqLwogICAgICAgIElXaW5lRDNEU3VyZmFjZV9CbHRGYXN0KFRoaXMtPmJhY2tCdWZmZXJbMF0sIDAsIDAsIFRoaXMtPndpbmVEM0REZXZpY2UtPmxvZ29fc3VyZmFjZSwgTlVMTCwgV0lORUREQkxURkFTVF9TUkNDT0xPUktFWSk7CiAgICB9CgogICAgaWYgKHBTb3VyY2VSZWN0IHx8IHBEZXN0UmVjdCkgRklYTUUoIlVuaGFuZGxlZCBwcmVzZW50IG9wdGlvbnMgJXAvJXBcbiIsIHBTb3VyY2VSZWN0LCBwRGVzdFJlY3QpOwogICAgLyogVE9ETzogSWYgb25seSBzb3VyY2UgcmVjdCBvciBkZXN0IHJlY3QgYXJlIHN1cHBsaWVkIHRoZW4gY2xpcCB0aGUgd2luZG93IHRvIG1hdGNoICovCiAgICBUUkFDRSgicHJlc2V0dGluZyBIREMgJXBcbiIsIFRoaXMtPmNvbnRleHRbMF0tPmhkYyk7CgogICAgLyogRG9uJ3QgY2FsbCBjaGVja0dMY2FsbCwgYXMgZ2xHZXRFcnJvciBpcyBub3QgYXBwbGljYWJsZSBoZXJlICovCiAgICBpZiAoaERlc3RXaW5kb3dPdmVycmlkZSAmJiBUaGlzLT53aW5faGFuZGxlICE9IGhEZXN0V2luZG93T3ZlcnJpZGUpIHsKICAgICAgICBXSU5FRDNETE9DS0VEX1JFQ1QgcjsKICAgICAgICBCWVRFICptZW07CgogICAgICAgIFRSQUNFKCJQZXJmb3JtaW5nIGRlc3Qgb3ZlcnJpZGUgb2Ygc3dhcGNoYWluICVwIGZyb20gd2luZG93ICVwIHRvICVwXG4iLCBUaGlzLCBUaGlzLT53aW5faGFuZGxlLCBoRGVzdFdpbmRvd092ZXJyaWRlKTsKICAgICAgICBpZihUaGlzLT5jb250ZXh0WzBdID09IFRoaXMtPndpbmVEM0REZXZpY2UtPmNvbnRleHRzWzBdKSB7CiAgICAgICAgICAgIC8qIFRoZSBwcmltYXJ5IGNvbnRleHQgJ293bnMnIGFsbCB0aGUgb3BlbmdsIHJlc291cmNlcy4gRGVzdHJveWluZyBhbmQgcmVjcmVhdGluZyB0aGF0IGNvbnRleHQgd291bGQgcmVxdWlyZSBkb3dubG9hZGluZwogICAgICAgICAgICAgKiBhbGwgb3BlbmdsIHJlc291cmNlcywgZGVsZXRpbmcgdGhlIGdsIHJlc291cmNlcywgZGVzdHJveWluZyBhbGwgb3RoZXIgY29udGV4dHMsIHRoZW4gcmVjcmVhdGluZyBhbGwgb3RoZXIgY29udGV4dHMKICAgICAgICAgICAgICogYW5kIHJlbG9hZCB0aGUgcmVzb3VyY2VzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBFUlIoIkNhbm5vdCBjaGFuZ2UgdGhlIGRlc3RpbmF0aW9uIHdpbmRvdyBvZiB0aGUgb3duZXIgb2YgdGhlIHByaW1hcnkgY29udGV4dFxuIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVGhpcy0+d2luX2hhbmRsZSAgICAgICAgICAgICA9IGhEZXN0V2luZG93T3ZlcnJpZGU7CgogICAgICAgICAgICAvKiBUaGUgb2xkIGJhY2sgYnVmZmVyIGhhcyB0byBiZSBjb3BpZWQgb3ZlciB0byB0aGUgbmV3IGJhY2sgYnVmZmVyLiBBIGxvY2tyZWN0IC0gc3dpdGNoY29udGV4dCAtIHVubG9ja3JlY3QKICAgICAgICAgICAgICogd291bGQgc3VmZmljZSBpbiB0aGVvcnksIGJ1dCBpdCBpcyByYXRoZXIgbmFzdHkgYW5kIG1heSBjYXVzZSB0cm91YmxlcyB3aXRoIGZ1dHVyZSBjaGFuZ2VzIG9mIHRoZSBsb2NraW5nIGNvZGUKICAgICAgICAgICAgICogU28gbG9jayByZWFkIG9ubHksIGNvcHkgdGhlIHN1cmZhY2Ugb3V0LCB0aGVuIGxvY2sgd2l0aCB0aGUgZGlzY2FyZCBmbGFnIGFuZCB3cml0ZSBiYWNrCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3QoVGhpcy0+YmFja0J1ZmZlclswXSwgJnIsIE5VTEwsIFdJTkVEM0RMT0NLX1JFQURPTkxZKTsKICAgICAgICAgICAgbWVtID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHIuUGl0Y2ggKiAoKElXaW5lRDNEU3VyZmFjZUltcGwgKikgVGhpcy0+YmFja0J1ZmZlclswXSktPmN1cnJlbnREZXNjLkhlaWdodCk7CiAgICAgICAgICAgIG1lbWNweShtZW0sIHIucEJpdHMsIHIuUGl0Y2ggKiAoKElXaW5lRDNEU3VyZmFjZUltcGwgKikgVGhpcy0+YmFja0J1ZmZlclswXSktPmN1cnJlbnREZXNjLkhlaWdodCk7CiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KFRoaXMtPmJhY2tCdWZmZXJbMF0pOwoKICAgICAgICAgICAgRGVzdHJveUNvbnRleHQoVGhpcy0+d2luZUQzRERldmljZSwgVGhpcy0+Y29udGV4dFswXSk7CiAgICAgICAgICAgIFRoaXMtPmNvbnRleHRbMF0gPSBDcmVhdGVDb250ZXh0KFRoaXMtPndpbmVEM0REZXZpY2UsIChJV2luZUQzRFN1cmZhY2VJbXBsICopIFRoaXMtPmZyb250QnVmZmVyLCBUaGlzLT53aW5faGFuZGxlLCBGQUxTRSAvKiBwYnVmZmVyICovLCAmVGhpcy0+cHJlc2VudFBhcm1zKTsKCiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9Mb2NrUmVjdChUaGlzLT5iYWNrQnVmZmVyWzBdLCAmciwgTlVMTCwgV0lORUQzRExPQ0tfRElTQ0FSRCk7CiAgICAgICAgICAgIG1lbWNweShyLnBCaXRzLCBtZW0sIHIuUGl0Y2ggKiAoKElXaW5lRDNEU3VyZmFjZUltcGwgKikgVGhpcy0+YmFja0J1ZmZlclswXSktPmN1cnJlbnREZXNjLkhlaWdodCk7CiAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIG1lbSk7CiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KFRoaXMtPmJhY2tCdWZmZXJbMF0pOwogICAgICAgIH0KICAgIH0KCiAgICBTd2FwQnVmZmVycyhUaGlzLT5jb250ZXh0WzBdLT5oZGMpOyAvKiBUT0RPOiBjeWNsZSB0aHJvdWdoIHRoZSBzd2FwY2hhaW4gYnVmZmVycyAqLwoKICAgIFRSQUNFKCJTd2FwQnVmZmVycyBjYWxsZWQsIFN0YXJ0aW5nIG5ldyBmcmFtZVxuIik7CiAgICAvKiBGUFMgc3VwcG9ydCAqLwogICAgaWYgKFRSQUNFX09OKGZwcykpCiAgICB7CiAgICAgICAgRFdPUkQgdGltZSA9IEdldFRpY2tDb3VudCgpOwogICAgICAgIFRoaXMtPmZyYW1lcysrOwogICAgICAgIC8qIGV2ZXJ5IDEuNSBzZWNvbmRzICovCiAgICAgICAgaWYgKHRpbWUgLSBUaGlzLT5wcmV2X3RpbWUgPiAxNTAwKSB7CiAgICAgICAgICAgIFRSQUNFXyhmcHMpKCIlcCBAIGFwcHJveCAlLjJmZnBzXG4iLCBUaGlzLCAxMDAwLjAqVGhpcy0+ZnJhbWVzLyh0aW1lIC0gVGhpcy0+cHJldl90aW1lKSk7CiAgICAgICAgICAgIFRoaXMtPnByZXZfdGltZSA9IHRpbWU7CiAgICAgICAgICAgIFRoaXMtPmZyYW1lcyA9IDA7CiAgICAgICAgfQogICAgfQoKI2lmIGRlZmluZWQoRlJBTUVfREVCVUdHSU5HKQp7CiAgICBpZiAoR2V0RmlsZUF0dHJpYnV0ZXNBKCJDOlxcRDNEVFJBQ0UiKSAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgewogICAgICAgIGlmICghaXNPbikgewogICAgICAgICAgICBpc09uID0gVFJVRTsKICAgICAgICAgICAgRklYTUUoIkVuYWJsaW5nIEQzRCBUcmFjZVxuIik7CiAgICAgICAgICAgIF9fV0lORV9TRVRfREVCVUdHSU5HKF9fV0lORV9EQkNMX1RSQUNFLCBfX3dpbmVfZGJjaF9kM2QsIDEpOwojaWYgZGVmaW5lZChTSE9XX0ZSQU1FX01BS0VVUCkKICAgICAgICAgICAgRklYTUUoIlNpbmdlIEZyYW1lIHNuYXBzaG90cyBTdGFydGluZ1xuIik7CiAgICAgICAgICAgIGlzRHVtcGluZ0ZyYW1lcyA9IFRSVUU7CiAgICAgICAgICAgIEVOVEVSX0dMKCk7CiAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CiAgICAgICAgICAgIExFQVZFX0dMKCk7CiNlbmRpZgoKI2lmIGRlZmluZWQoU0lOR0xFX0ZSQU1FX0RFQlVHR0lORykKICAgICAgICB9IGVsc2UgewojaWYgZGVmaW5lZChTSE9XX0ZSQU1FX01BS0VVUCkKICAgICAgICAgICAgRklYTUUoIlNpbmdlIEZyYW1lIHNuYXBzaG90cyBGaW5pc2hpbmdcbiIpOwogICAgICAgICAgICBpc0R1bXBpbmdGcmFtZXMgPSBGQUxTRTsKI2VuZGlmCiAgICAgICAgICAgIEZJWE1FKCJTaW5nZSBGcmFtZSB0cmFjZSBjb21wbGV0ZVxuIik7CiAgICAgICAgICAgIERlbGV0ZUZpbGVBKCJDOlxcRDNEVFJBQ0UiKTsKICAgICAgICAgICAgX19XSU5FX1NFVF9ERUJVR0dJTkcoX19XSU5FX0RCQ0xfVFJBQ0UsIF9fd2luZV9kYmNoX2QzZCwgMCk7CiNlbmRpZgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzT24pIHsKICAgICAgICAgICAgaXNPbiA9IEZBTFNFOwojaWYgZGVmaW5lZChTSE9XX0ZSQU1FX01BS0VVUCkKICAgICAgICAgICAgRklYTUUoIlNpbmdsZSBGcmFtZSBzbmFwc2hvdHMgRmluaXNoaW5nXG4iKTsKICAgICAgICAgICAgaXNEdW1waW5nRnJhbWVzID0gRkFMU0U7CiNlbmRpZgogICAgICAgICAgICBGSVhNRSgiRGlzYWJsaW5nIEQzRCBUcmFjZVxuIik7CiAgICAgICAgICAgIF9fV0lORV9TRVRfREVCVUdHSU5HKF9fV0lORV9EQkNMX1RSQUNFLCBfX3dpbmVfZGJjaF9kM2QsIDApOwogICAgICAgIH0KICAgIH0KfQojZW5kaWYKCiAgICAvKiBUaGlzIGlzIGRpc2FibGVkLCBidXQgdGhlIGNvZGUgbGVmdCBpbiBmb3IgZGVidWcgcHVycG9zZXMuCiAgICAgKgogICAgICogU2luY2Ugd2UncmUgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG5ldyBiYWNrIGJ1ZmZlciBvbiBhIEQzRFNXQVBFRkZFQ1RfRElTQ0FSRCBmbGlwLAogICAgICogd2UgY2FuIGNsZWFyIGl0IHdpdGggc29tZSB1Z2x5IGNvbG9yIHRvIG1ha2UgYmFkIGRyYXdpbmcgdmlzaWJsZSBhbmQgZWFzZSBkZWJ1Z2dpbmcuCiAgICAgKiBUaGUgRGVidWcgcnVudGltZSBkb2VzIHRoZSBzYW1lIG9uIFdpbmRvd3MuIEhvd2V2ZXIsIGEgZmV3IGdhbWVzIGRvIG5vdCByZWRyYXcgdGhlCiAgICAgKiBzY3JlZW4gcHJvcGVybHksIGxpa2UgTWF4IFBheW5lIDIsIHdoaWNoIGxlYXZlcyBhIGZldyBwaXhlbHMgdW5kZWZpbmVkLgogICAgICoKICAgICAqIFRlc3RzIHNob3cgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgYmFjayBidWZmZXIgYWZ0ZXIgYSBkaXNjYXJkIGZsaXAgaXMgaW5kZWVkIG5vdAogICAgICogcmVsaWFibGUsIHNvIG5vIGdhbWUgY2FuIGRlcGVuZCBvbiB0aGUgZXhhY3QgY29udGVudC4gSG93ZXZlciwgaXQgcmVzZW1ibGVzIHRoZQogICAgICogb2xkIGNvbnRlbnRzIGluIHNvbWUgd2F5LCBmb3IgZXhhbXBsZSBieSBzaG93aW5nIGZyYWdtZW50cyBhdCBvdGhlciBsb2NhdGlvbnMuIEluCiAgICAgKiBnZW5lcmFsLCB0aGUgY29sb3IgdGhlbWUgaXMgc3RpbGwgaW50YWN0LiBTbyBNYXggcGF5bmUsIHdoaWNoIGRyYXdzIHJhdGhlciBkYXJrIHNjZW5lcwogICAgICogZ2V0cyBhIGRhcmsgYmFja2dyb3VuZCBpbWFnZS4gSWYgd2UgY2xlYXIgaXQgd2l0aCBhIGJyaWdodCB1Z2x5IGNvbG9yLCB0aGUgZ2FtZSdzCiAgICAgKiBidWcgc2hvd3MgdXAgbXVjaCBtb3JlIHRoYW4gaXQgZG9lcyBvbiBXaW5kb3dzLCBhbmQgdGhlIHBsYXllcnMgc2VlIHNpbmdsZSBwaXhlbHMKICAgICAqIHdpdGggd3JvbmcgY29sb3JzLgogICAgICogKFRoZSBNYXggUGF5bmUgYnVnIGhhcyBiZWVuIGNvbmZpcm1lZCBvbiBXaW5kb3dzIHdpdGggdGhlIGRlYnVnIHJ1bnRpbWUpCiAgICAgKi8KICAgIGlmIChGQUxTRSAmJiBUaGlzLT5wcmVzZW50UGFybXMuU3dhcEVmZmVjdCA9PSBXSU5FRDNEU1dBUEVGRkVDVF9ESVNDQVJEKSB7CiAgICAgICAgVFJBQ0UoIkNsZWFyaW5nIHRoZSBjb2xvciBidWZmZXIgd2l0aCBjeWFuIGNvbG9yXG4iKTsKCiAgICAgICAgSVdpbmVEM0REZXZpY2VfQ2xlYXIoKElXaW5lRDNERGV2aWNlKilUaGlzLT53aW5lRDNERGV2aWNlLCAwLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEQ0xFQVJfVEFSR0VULCAweGZmMDBmZmZmLCAxLjAsIDApOwogICAgfQoKICAgIGlmKCgoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBUaGlzLT5mcm9udEJ1ZmZlciktPkZsYWdzICAgJiBTRkxBR19JTlNZU01FTSB8fAogICAgICAgKChJV2luZUQzRFN1cmZhY2VJbXBsICopIFRoaXMtPmJhY2tCdWZmZXJbMF0pLT5GbGFncyAmIFNGTEFHX0lOU1lTTUVNICkgewogICAgICAgIC8qIEJvdGggbWVtb3J5IGNvcGllcyBvZiB0aGUgc3VyZmFjZXMgYXJlIG9rLCBmbGlwIHRoZW0gYXJvdW5kIHRvbyBpbnN0ZWFkIG9mIGRpcnRpZnlpbmcgKi8KICAgICAgICBJV2luZUQzRFN1cmZhY2VJbXBsICpmcm9udCA9IChJV2luZUQzRFN1cmZhY2VJbXBsICopIFRoaXMtPmZyb250QnVmZmVyOwogICAgICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKmJhY2sgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBUaGlzLT5iYWNrQnVmZmVyWzBdOwogICAgICAgIEJPT0wgZnJvbnR1cHRvZGF0ZSA9IGZyb250LT5GbGFncyAmIFNGTEFHX0lOU1lTTUVNOwogICAgICAgIEJPT0wgYmFja3VwdG9kYXRlID0gYmFjay0+RmxhZ3MgJiBTRkxBR19JTlNZU01FTTsKCiAgICAgICAgaWYoZnJvbnQtPnJlc291cmNlLnNpemUgPT0gYmFjay0+cmVzb3VyY2Uuc2l6ZSkgewogICAgICAgICAgICAvKiBGbGlwIHRoZSBEQyAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBIREMgdG1wOwogICAgICAgICAgICAgICAgdG1wID0gZnJvbnQtPmhEQzsKICAgICAgICAgICAgICAgIGZyb250LT5oREMgPSBiYWNrLT5oREM7CiAgICAgICAgICAgICAgICBiYWNrLT5oREMgPSB0bXA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEZsaXAgdGhlIERJQnNlY3Rpb24gKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSEJJVE1BUCB0bXA7CiAgICAgICAgICAgICAgICBCT09MIGhhc0RpYiA9IGZyb250LT5GbGFncyAmIFNGTEFHX0RJQlNFQ1RJT047CiAgICAgICAgICAgICAgICB0bXAgPSBmcm9udC0+ZGliLkRJQnNlY3Rpb247CiAgICAgICAgICAgICAgICBmcm9udC0+ZGliLkRJQnNlY3Rpb24gPSBiYWNrLT5kaWIuRElCc2VjdGlvbjsKICAgICAgICAgICAgICAgIGJhY2stPmRpYi5ESUJzZWN0aW9uID0gdG1wOwoKICAgICAgICAgICAgICAgIGlmKGJhY2stPkZsYWdzICYgU0ZMQUdfRElCU0VDVElPTikgZnJvbnQtPkZsYWdzIHw9IFNGTEFHX0RJQlNFQ1RJT047CiAgICAgICAgICAgICAgICBlbHNlIGZyb250LT5GbGFncyAmPSB+U0ZMQUdfRElCU0VDVElPTjsKICAgICAgICAgICAgICAgIGlmKGhhc0RpYikgYmFjay0+RmxhZ3MgfD0gU0ZMQUdfRElCU0VDVElPTjsKICAgICAgICAgICAgICAgIGVsc2UgYmFjay0+RmxhZ3MgJj0gflNGTEFHX0RJQlNFQ1RJT047CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEZsaXAgdGhlIHN1cmZhY2UgZGF0YSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2b2lkKiB0bXA7CgogICAgICAgICAgICAgICAgdG1wID0gZnJvbnQtPmRpYi5iaXRtYXBfZGF0YTsKICAgICAgICAgICAgICAgIGZyb250LT5kaWIuYml0bWFwX2RhdGEgPSBiYWNrLT5kaWIuYml0bWFwX2RhdGE7CiAgICAgICAgICAgICAgICBiYWNrLT5kaWIuYml0bWFwX2RhdGEgPSB0bXA7CgogICAgICAgICAgICAgICAgdG1wID0gZnJvbnQtPnJlc291cmNlLmFsbG9jYXRlZE1lbW9yeTsKICAgICAgICAgICAgICAgIGZyb250LT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgPSBiYWNrLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnk7CiAgICAgICAgICAgICAgICBiYWNrLT5yZXNvdXJjZS5hbGxvY2F0ZWRNZW1vcnkgPSB0bXA7CgogICAgICAgICAgICAgICAgdG1wID0gZnJvbnQtPnJlc291cmNlLmhlYXBNZW1vcnk7CiAgICAgICAgICAgICAgICBmcm9udC0+cmVzb3VyY2UuaGVhcE1lbW9yeSA9IGJhY2stPnJlc291cmNlLmhlYXBNZW1vcnk7CiAgICAgICAgICAgICAgICBiYWNrLT5yZXNvdXJjZS5oZWFwTWVtb3J5ID0gdG1wOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBGbGlwIHRoZSBQQk8gKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRFdPUkQgdG1wX2ZsYWdzID0gZnJvbnQtPkZsYWdzOwoKICAgICAgICAgICAgICAgIEdMdWludCB0bXBfcGJvID0gZnJvbnQtPnBibzsKICAgICAgICAgICAgICAgIGZyb250LT5wYm8gPSBiYWNrLT5wYm87CiAgICAgICAgICAgICAgICBiYWNrLT5wYm8gPSB0bXBfcGJvOwoKICAgICAgICAgICAgICAgIGlmKGJhY2stPkZsYWdzICYgU0ZMQUdfUEJPKQogICAgICAgICAgICAgICAgICAgIGZyb250LT5GbGFncyB8PSBTRkxBR19QQk87CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZnJvbnQtPkZsYWdzICY9IH5TRkxBR19QQk87CgogICAgICAgICAgICAgICAgaWYodG1wX2ZsYWdzICYgU0ZMQUdfUEJPKQogICAgICAgICAgICAgICAgICAgIGJhY2stPkZsYWdzIHw9IFNGTEFHX1BCTzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBiYWNrLT5GbGFncyAmPSB+U0ZMQUdfUEJPOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBjbGllbnRfbWVtb3J5IHNob3VsZCBub3QgYmUgZGlmZmVyZW50LCBidXQganVzdCBpbiBjYXNlICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEJPT0wgdG1wOwogICAgICAgICAgICAgICAgdG1wID0gZnJvbnQtPmRpYi5jbGllbnRfbWVtb3J5OwogICAgICAgICAgICAgICAgZnJvbnQtPmRpYi5jbGllbnRfbWVtb3J5ID0gYmFjay0+ZGliLmNsaWVudF9tZW1vcnk7CiAgICAgICAgICAgICAgICBiYWNrLT5kaWIuY2xpZW50X21lbW9yeSA9IHRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihmcm9udHVwdG9kYXRlKSBiYWNrLT5GbGFncyB8PSBTRkxBR19JTlNZU01FTTsKICAgICAgICAgICAgZWxzZSBiYWNrLT5GbGFncyAmPSB+U0ZMQUdfSU5TWVNNRU07CiAgICAgICAgICAgIGlmKGJhY2t1cHRvZGF0ZSkgZnJvbnQtPkZsYWdzIHw9IFNGTEFHX0lOU1lTTUVNOwogICAgICAgICAgICBlbHNlIGZyb250LT5GbGFncyAmPSB+U0ZMQUdfSU5TWVNNRU07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX01vZGlmeUxvY2F0aW9uKChJV2luZUQzRFN1cmZhY2UgKikgZnJvbnQsIFNGTEFHX0lORFJBV0FCTEUsIFRSVUUpOwogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfTW9kaWZ5TG9jYXRpb24oKElXaW5lRDNEU3VyZmFjZSAqKSBiYWNrLCBTRkxBR19JTkRSQVdBQkxFLCBUUlVFKTsKICAgICAgICB9CiAgICB9CgogICAgaWYoVGhpcy0+cHJlc2VudFBhcm1zLlByZXNlbnRhdGlvbkludGVydmFsICE9IFdJTkVEM0RQUkVTRU5UX0lOVEVSVkFMX0lNTUVESUFURSAmJiBHTF9TVVBQT1JUKFNHSV9WSURFT19TWU5DKSkgewogICAgICAgIHJldHZhbCA9IEdMX0VYVENBTEwoZ2xYR2V0VmlkZW9TeW5jU0dJKCZzeW5jKSk7CiAgICAgICAgaWYocmV0dmFsICE9IDApIHsKICAgICAgICAgICAgRVJSKCJnbFhHZXRWaWRlb1N5bmNTR0kgZmFpbGVkKHJldHZhbCA9ICVkXG4iLCByZXR2YWwpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoKFRoaXMtPnByZXNlbnRQYXJtcy5QcmVzZW50YXRpb25JbnRlcnZhbCkgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RQUkVTRU5UX0lOVEVSVkFMX0RFRkFVTFQ6CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFBSRVNFTlRfSU5URVJWQUxfT05FOgogICAgICAgICAgICAgICAgaWYoc3luYyA8PSBUaGlzLT52U3luY0NvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBHTF9FWFRDQUxMKGdsWFdhaXRWaWRlb1N5bmNTR0koMSwgMCwgJlRoaXMtPnZTeW5jQ291bnRlcikpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUaGlzLT52U3luY0NvdW50ZXIgPSBzeW5jOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFBSRVNFTlRfSU5URVJWQUxfVFdPOgogICAgICAgICAgICAgICAgaWYoc3luYyA8PSBUaGlzLT52U3luY0NvdW50ZXIgKyAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gR0xfRVhUQ0FMTChnbFhXYWl0VmlkZW9TeW5jU0dJKDIsIFRoaXMtPnZTeW5jQ291bnRlciAmIDB4MSwgJlRoaXMtPnZTeW5jQ291bnRlcikpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUaGlzLT52U3luY0NvdW50ZXIgPSBzeW5jOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgV0lORUQzRFBSRVNFTlRfSU5URVJWQUxfVEhSRUU6CiAgICAgICAgICAgICAgICBpZihzeW5jIDw9IFRoaXMtPnZTeW5jQ291bnRlciArIDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBHTF9FWFRDQUxMKGdsWFdhaXRWaWRlb1N5bmNTR0koMywgVGhpcy0+dlN5bmNDb3VudGVyICUgMHgzLCAmVGhpcy0+dlN5bmNDb3VudGVyKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRoaXMtPnZTeW5jQ291bnRlciA9IHN5bmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBXSU5FRDNEUFJFU0VOVF9JTlRFUlZBTF9GT1VSOgogICAgICAgICAgICAgICAgaWYoc3luYyA8PSBUaGlzLT52U3luY0NvdW50ZXIgKyAzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gR0xfRVhUQ0FMTChnbFhXYWl0VmlkZW9TeW5jU0dJKDQsIFRoaXMtPnZTeW5jQ291bnRlciAmIDB4MywgJlRoaXMtPnZTeW5jQ291bnRlcikpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUaGlzLT52U3luY0NvdW50ZXIgPSBzeW5jOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBGSVhNRSgiVW5rbm93biBwcmVzZW50YXRpb24gaW50ZXJ2YWwgJTA4eFxuIiwgVGhpcy0+cHJlc2VudFBhcm1zLlByZXNlbnRhdGlvbkludGVydmFsKTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0UoInJldHVybmluZ1xuIik7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRGcm9udEJ1ZmZlckRhdGEoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlLCBJV2luZUQzRFN1cmZhY2UgKnBEZXN0U3VyZmFjZSkgewogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICpUaGlzID0gKElXaW5lRDNEU3dhcENoYWluSW1wbCAqKWlmYWNlOwogICAgUE9JTlQgc3RhcnQ7CgogICAgVFJBQ0UoIiglcCkgOiBpZmFjZSglcCkgcERlc3RTdXJmYWNlKCVwKVxuIiwgVGhpcywgaWZhY2UsIHBEZXN0U3VyZmFjZSk7CgogICAgc3RhcnQueCA9IDA7CiAgICBzdGFydC55ID0gMDsKCiAgICBpZiAoVGhpcy0+cHJlc2VudFBhcm1zLldpbmRvd2VkKSB7CiAgICAgICAgTWFwV2luZG93UG9pbnRzKFRoaXMtPndpbl9oYW5kbGUsIE5VTEwsICZzdGFydCwgMSk7CiAgICB9CgogICAgSVdpbmVEM0RTdXJmYWNlX0JsdEZhc3QocERlc3RTdXJmYWNlLCBzdGFydC54LCBzdGFydC55LCBUaGlzLT5mcm9udEJ1ZmZlciwgTlVMTCwgMCk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRCYWNrQnVmZmVyKElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgVUlOVCBpQmFja0J1ZmZlciwgV0lORUQzREJBQ0tCVUZGRVJfVFlQRSBUeXBlLCBJV2luZUQzRFN1cmZhY2UgKipwcEJhY2tCdWZmZXIpIHsKCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGwgKlRoaXMgPSAoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopaWZhY2U7CgogICAgaWYgKGlCYWNrQnVmZmVyID4gVGhpcy0+cHJlc2VudFBhcm1zLkJhY2tCdWZmZXJDb3VudCAtIDEpIHsKICAgICAgICBUUkFDRSgiQmFjayBidWZmZXIgY291bnQgb3V0IG9mIHJhbmdlXG4iKTsKICAgICAgICAvKiBOYXRpdmUgZDNkOSBkb2Vzbid0IHNldCBOVUxMIGhlcmUsIGp1c3QgYXMgd2luZSdzIGQzZDkuIEJ1dCBzZXQgaXQgaGVyZQogICAgICAgICAqIGluIHdpbmVkM2QgdG8gYXZvaWQgcHJvYmxlbXMgaW4gb3RoZXIgbGlicwogICAgICAgICAqLwogICAgICAgICpwcEJhY2tCdWZmZXIgPSBOVUxMOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgICpwcEJhY2tCdWZmZXIgPSBUaGlzLT5iYWNrQnVmZmVyW2lCYWNrQnVmZmVyXTsKICAgIFRSQUNFKCIoJXApIDogQmFja0J1ZiAlZCBUeXBlICVkICByZXR1cm5pbmcgJXBcbiIsIFRoaXMsIGlCYWNrQnVmZmVyLCBUeXBlLCAqcHBCYWNrQnVmZmVyKTsKCiAgICAvKiBOb3RlIGluYyByZWYgb24gcmV0dXJuZWQgc3VyZmFjZSAqLwogICAgaWYoKnBwQmFja0J1ZmZlcikgSVdpbmVEM0RTdXJmYWNlX0FkZFJlZigqcHBCYWNrQnVmZmVyKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwoKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRSYXN0ZXJTdGF0dXMoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlLCBXSU5FRDNEUkFTVEVSX1NUQVRVUyAqcFJhc3RlclN0YXR1cykgewogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICpUaGlzID0gKElXaW5lRDNEU3dhcENoYWluSW1wbCAqKWlmYWNlOwogICAgc3RhdGljIEJPT0wgc2hvd0ZpeG1lcyA9IFRSVUU7CiAgICBwUmFzdGVyU3RhdHVzLT5JblZCbGFuayA9IFRSVUU7CiAgICBwUmFzdGVyU3RhdHVzLT5TY2FuTGluZSA9IDA7CiAgICAvKiBObyBvcGVuR0wgZXF1aXZhbGVudCAqLwogICAgaWYoc2hvd0ZpeG1lcykgewogICAgICAgIEZJWE1FKCIoJXApIDogc3R1YiAob25jZSlcbiIsIFRoaXMpOwogICAgICAgIHNob3dGaXhtZXMgPSBGQUxTRTsKICAgIH0KICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX0dldERpc3BsYXlNb2RlKElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgV0lORUQzRERJU1BMQVlNT0RFKnBNb2RlKSB7CiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGwgKlRoaXMgPSAoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopaWZhY2U7CiAgICBIUkVTVUxUIGhyOwoKICAgIFRSQUNFKCIoJXApLT4oJXApOiBDYWxsaW5nIEdldEFkYXB0ZXJEaXNwbGF5TW9kZVxuIiwgVGhpcywgcE1vZGUpOwogICAgaHIgPSBJV2luZUQzRF9HZXRBZGFwdGVyRGlzcGxheU1vZGUoVGhpcy0+d2luZUQzRERldmljZS0+d2luZUQzRCwgVGhpcy0+d2luZUQzRERldmljZS0+YWRhcHRlci0+bnVtLCBwTW9kZSk7CgogICAgVFJBQ0UoIiglcCkgOiByZXR1cm5pbmcgdyglZCkgaCglZCkgcnIoJWQpIGZtdCgldSwlcylcbiIsIFRoaXMsIHBNb2RlLT5XaWR0aCwgcE1vZGUtPkhlaWdodCwgcE1vZGUtPlJlZnJlc2hSYXRlLAogICAgcE1vZGUtPkZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KHBNb2RlLT5Gb3JtYXQpKTsKICAgIHJldHVybiBocjsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXREZXZpY2UoSVdpbmVEM0RTd2FwQ2hhaW4gKmlmYWNlLCBJV2luZUQzRERldmljZSoqcHBEZXZpY2UpIHsKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKilpZmFjZTsKCiAgICAqcHBEZXZpY2UgPSAoSVdpbmVEM0REZXZpY2UgKikgVGhpcy0+d2luZUQzRERldmljZTsKCiAgICAvKiBOb3RlICBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaW5jcmVhc2UgdGhlIGludGVybmFsIHJlZmVyZW5jZSBjb3VudAogICAgICAgb24gdGhlIElEaXJlY3QzRERldmljZTkgaW50ZXJmYWNlLiAqLwogICAgSVdpbmVEM0REZXZpY2VfQWRkUmVmKCpwcERldmljZSk7CiAgICBUUkFDRSgiKCVwKSA6IHJldHVybmluZyAlcFxuIiwgVGhpcywgKnBwRGV2aWNlKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX0dldFByZXNlbnRQYXJhbWV0ZXJzKElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgV0lORUQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcFByZXNlbnRhdGlvblBhcmFtZXRlcnMpIHsKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKilpZmFjZTsKICAgIFRSQUNFKCIoJXApXG4iLCBUaGlzKTsKCiAgICAqcFByZXNlbnRhdGlvblBhcmFtZXRlcnMgPSBUaGlzLT5wcmVzZW50UGFybXM7CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzRFN3YXBDaGFpbkltcGxfU2V0R2FtbWFSYW1wKElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgRFdPUkQgRmxhZ3MsIENPTlNUIFdJTkVEM0RHQU1NQVJBTVAgKnBSYW1wKXsKCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGwgKlRoaXMgPSAoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopaWZhY2U7CiAgICBIREMgaERDOwogICAgVFJBQ0UoIiglcCkgOiBwUmFtcEAlcCBmbGFncyglZClcbiIsIFRoaXMsIHBSYW1wLCBGbGFncyk7CiAgICBoREMgPSBHZXREQyhUaGlzLT53aW5faGFuZGxlKTsKICAgIFNldERldmljZUdhbW1hUmFtcChoREMsIChMUFZPSUQpcFJhbXApOwogICAgUmVsZWFzZURDKFRoaXMtPndpbl9oYW5kbGUsIGhEQyk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKCn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzRFN3YXBDaGFpbkltcGxfR2V0R2FtbWFSYW1wKElXaW5lRDNEU3dhcENoYWluICppZmFjZSwgV0lORUQzREdBTU1BUkFNUCAqcFJhbXApewoKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKilpZmFjZTsKICAgIEhEQyBoREM7CiAgICBUUkFDRSgiKCVwKSA6IHBSYW1wQCVwXG4iLCBUaGlzLCBwUmFtcCk7CiAgICBoREMgPSBHZXREQyhUaGlzLT53aW5faGFuZGxlKTsKICAgIEdldERldmljZUdhbW1hUmFtcChoREMsIHBSYW1wKTsKICAgIFJlbGVhc2VEQyhUaGlzLT53aW5faGFuZGxlLCBoREMpOwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cgp9CgoKY29uc3QgSVdpbmVEM0RTd2FwQ2hhaW5WdGJsIElXaW5lRDNEU3dhcENoYWluX1Z0YmwgPQp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX0FkZFJlZiwKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbF9SZWxlYXNlLAogICAgLyogSVdpbmVEM0RTd2FwQ2hhaW4gKi8KICAgIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRQYXJlbnQsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfRGVzdHJveSwKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXREZXZpY2UsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfUHJlc2VudCwKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRGcm9udEJ1ZmZlckRhdGEsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfR2V0QmFja0J1ZmZlciwKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbF9HZXRSYXN0ZXJTdGF0dXMsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfR2V0RGlzcGxheU1vZGUsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfR2V0UHJlc2VudFBhcmFtZXRlcnMsCiAgICBJV2luZUQzRFN3YXBDaGFpbkltcGxfU2V0R2FtbWFSYW1wLAogICAgSVdpbmVEM0RTd2FwQ2hhaW5JbXBsX0dldEdhbW1hUmFtcAp9OwoKV2luZUQzRENvbnRleHQgKklXaW5lRDNEU3dhcENoYWluSW1wbF9DcmVhdGVDb250ZXh0Rm9yVGhyZWFkKElXaW5lRDNEU3dhcENoYWluICppZmFjZSkgewogICAgV2luZUQzRENvbnRleHQgKmN0eDsKICAgIElXaW5lRDNEU3dhcENoYWluSW1wbCAqVGhpcyA9IChJV2luZUQzRFN3YXBDaGFpbkltcGwgKikgaWZhY2U7CiAgICBXaW5lRDNEQ29udGV4dCAqKm5ld0FycmF5OwoKICAgIFRSQUNFKCJDcmVhdGluZyBhIG5ldyBjb250ZXh0IGZvciBzd2FwY2hhaW4gJXAsIHRocmVhZCAlZFxuIiwgVGhpcywgR2V0Q3VycmVudFRocmVhZElkKCkpOwoKICAgIGN0eCA9IENyZWF0ZUNvbnRleHQoVGhpcy0+d2luZUQzRERldmljZSwgKElXaW5lRDNEU3VyZmFjZUltcGwgKikgVGhpcy0+ZnJvbnRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmNvbnRleHRbMF0tPndpbl9oYW5kbGUsIEZBTFNFIC8qIHBidWZmZXIgKi8sICZUaGlzLT5wcmVzZW50UGFybXMpOwogICAgaWYoIWN0eCkgewogICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGZvciB0aGUgc3dhcGNoYWluXG4iKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBuZXdBcnJheSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKm5ld0FycmF5KSAqIFRoaXMtPm51bV9jb250ZXh0cyArIDEpOwogICAgaWYoIW5ld0FycmF5KSB7CiAgICAgICAgRVJSKCJPdXQgb2YgbWVtb3J5IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbmV3IGNvbnRleHQgYXJyYXlcbiIpOwogICAgICAgIERlc3Ryb3lDb250ZXh0KFRoaXMtPndpbmVEM0REZXZpY2UsIGN0eCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtZW1jcHkobmV3QXJyYXksIFRoaXMtPmNvbnRleHQsIHNpemVvZigqbmV3QXJyYXkpICogVGhpcy0+bnVtX2NvbnRleHRzKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPmNvbnRleHQpOwogICAgbmV3QXJyYXlbVGhpcy0+bnVtX2NvbnRleHRzXSA9IGN0eDsKICAgIFRoaXMtPmNvbnRleHQgPSBuZXdBcnJheTsKICAgIFRoaXMtPm51bV9jb250ZXh0cysrOwoKICAgIFRSQUNFKCJSZXR1cm5pbmcgY29udGV4dCAlcFxuIiwgY3R4KTsKICAgIHJldHVybiBjdHg7Cn0KCnZvaWQgZ2V0X2RyYXdhYmxlX3NpemVfc3dhcGNoYWluKElXaW5lRDNEU3VyZmFjZUltcGwgKlRoaXMsIFVJTlQgKndpZHRoLCBVSU5UICpoZWlnaHQpIHsKICAgIC8qIFRoZSBkcmF3YWJsZSBzaXplIG9mIGFuIG9uc2NyZWVuIGRyYXdhYmxlIGlzIHRoZSBzdXJmYWNlIHNpemUuCiAgICAgKiAoQWN0dWFsbHk6IFRoZSB3aW5kb3cgc2l6ZSwgYnV0IHRoZSBzdXJmYWNlIGlzIGNyZWF0ZWQgaW4gd2luZG93IHNpemUpCiAgICAgKi8KICAgICp3aWR0aCA9IFRoaXMtPmN1cnJlbnREZXNjLldpZHRoOwogICAgKmhlaWdodCA9IFRoaXMtPmN1cnJlbnREZXNjLkhlaWdodDsKfQo=