LyogRGlyZWN0M0QgTWF0ZXJpYWwKICogQ29weXJpZ2h0IChjKSAyMDAyIExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIETWU0lOR0VSCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0M0RNYXRlcmlhbC4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgpzdGF0aWMgdm9pZCBkdW1wX21hdGVyaWFsKExQRDNETUFURVJJQUwgbWF0KQp7CiAgICBEUFJJTlRGKCIgIGR3U2l6ZSA6ICVkXG4iLCBtYXQtPmR3U2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJVW5rbm93biBNZXRob2RzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpRdWVyeUludGVyZmFjZQogKgogKiBRdWVyeUludGVyZmFjZSBmb3IgSURpcmVjdDNETWF0ZXJpYWwuIENhbiBxdWVyeSBhbGwgSURpcmVjdDNETWF0ZXJpYWwKICogdmVyc2lvbnMuCiAqCiAqIFBhcmFtczoKICogIHJpaWQ6IEludGVyZmFjZSBpZCBxdWVyaWVkIGZvcgogKiAgb2JqOiBBZGRyZXNzIHRvIHBhc3MgdGhlIGludGVyZmFjZSBwb2ludGVyIGJhY2sKICoKICogUmV0dXJuczoKICogIFNfT0sgb24gc3VjY2VzcwogKiAgRV9OT0lOVEVSRkFDRSBpZiB0aGUgcmVxdWVzdGVkIGludGVyZmFjZSB3YXNuJ3QgZm91bmQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX1F1ZXJ5SW50ZXJmYWNlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CgogICAgKm9icCA9IE5VTEw7CgogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JVW5rbm93biwgIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKCSpvYnAgPSBpZmFjZTsKCVRSQUNFKCIgIENyZWF0aW5nIElVbmtub3duIGludGVyZmFjZSBhdCAlcC5cbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRE1hdGVyaWFsLCByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsKSk7CiAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsKTsKCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRE1hdGVyaWFsIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwyLCByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNETWF0ZXJpYWxfQWRkUmVmKElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsKSk7CiAgICAgICAgKm9icCA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzRE1hdGVyaWFsMik7CglUUkFDRSgiICBDcmVhdGluZyBJRGlyZWN0M0RNYXRlcmlhbDIgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKCXJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbDMsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwzKTsKCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6QWRkUmVmCiAqCiAqIEluY3JlYXNlcyB0aGUgcmVmY291bnQuCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfQWRkUmVmKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgaW5jcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgLSAxKTsKCiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpSZWxlYXNlCiAqCiAqIFJlZHVjZXMgdGhlIHJlZmNvdW50IGJ5IG9uZS4gSWYgdGhlIHJlZmNvdW50IGZhbGxzIHRvIDAsIHRoZSBvYmplY3QKICogaXMgZGVzdHJveWVkCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVsZWFzZShJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgVUxPTkcgcmVmID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCktPigpIGRlY3JlbWVudGluZyBmcm9tICV1LlxuIiwgVGhpcywgcmVmICsgMSk7CgogICAgaWYgKCFyZWYpCiAgICB7CiAgICAgICAgaWYoVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgVGhpcy0+ZGRyYXctPmQzZGRldmljZS0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS5wdHIgPSBOVUxMOwogICAgICAgICAgICBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnR5cGUgPSBERHJhd0hhbmRsZV9Vbmtub3duOwogICAgICAgIH0KCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcyk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gcmVmOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwgTWV0aG9kcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWw6OkluaXRpYWxpemUKICoKICogQSBuby1vcCBpbml0aWFsaXphdGlvbgogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRDogUG9pbnRlciB0byBhIERpcmVjdDNEIGludGVyZmFjZQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9Jbml0aWFsaXplKElEaXJlY3QzRE1hdGVyaWFsICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRCAqRGlyZWN0M0QpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIGlmYWNlKTsKCiAgICBUUkFDRSgiKCVwKS0+KCVwKSBuby1vcC4uLiFcbiIsIFRoaXMsIERpcmVjdDNEKTsKCiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWw6OlJlc2VydmUKICoKICogRGlyZWN0WCA1IHNkazogIlRoZSBJRGlyZWN0M0RNYXRlcmlhbDI6OlJlc2VydmUgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCIKICogT2RkLiBUaGV5IHNlZW0gdG8gaGF2ZSBtaXhlZCB0aGVpciBpbnRlcmZhY2VzLgogKgogKiBSZXR1cm5zOgogKiAgRERFUlJfVU5TVVBQT1JURUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX1Jlc2VydmUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgbm90IGltcGxlbWVudGVkXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gRERFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6VW5yZXNlcnZlCiAqCiAqIE5vdCBzdXBwb3J0ZWQgdG9vCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfVW5yZXNlcnZlKElEaXJlY3QzRE1hdGVyaWFsICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPigpIG5vdCBpbXBsZW1lbnRlZC5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6U2V0TWF0ZXJpYWwKICoKICogU2V0cyB0aGUgbWF0ZXJpYWwgZGVzY3JpcHRpb24KICoKICogUGFyYW1zOgogKiAgTWF0OiBNYXRlcmlhbCB0byBzZXQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdCBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9TZXRNYXRlcmlhbChJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUwgKmxwTWF0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwTWF0KTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkKICAgICAgICBkdW1wX21hdGVyaWFsKGxwTWF0KTsKCiAgICAvKiBTdG9yZXMgdGhlIG1hdGVyaWFsICovCiAgICBtZW1zZXQoJlRoaXMtPm1hdCwgMCwgc2l6ZW9mKFRoaXMtPm1hdCkpOwogICAgbWVtY3B5KCZUaGlzLT5tYXQsIGxwTWF0LCBscE1hdC0+ZHdTaXplKTsKICAgIAogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRNYXRlcmlhbAogKgogKiBSZXR1cm5zIHRoZSBtYXRlcmlhbCBhc3NpZ25lZCB0byB0aGlzIGludGVyZmFjZQogKgogKiBQYXJhbXM6CiAqICBNYXQ6IFBvaW50ZXIgdG8gYSBEM0RNQVRFUklBTCBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIG1hdGVyaWFsIGRlc2NyaXB0aW9uCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBNYXQgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0TWF0ZXJpYWwoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMICpscE1hdCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIERXT1JEIGR3U2l6ZTsKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBscE1hdCk7CiAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKICAgICAgICBUUkFDRSgiICBSZXR1cm5pbmcgbWF0ZXJpYWwgOiAiKTsKICAgICAgICBkdW1wX21hdGVyaWFsKCZUaGlzLT5tYXQpOwogICAgfQoKICAgIC8qIENvcGllcyB0aGUgbWF0ZXJpYWwgc3RydWN0dXJlICovCiAgICBkd1NpemUgPSBscE1hdC0+ZHdTaXplOwogICAgbWVtc2V0KGxwTWF0LCAwLCBkd1NpemUpOwogICAgbWVtY3B5KGxwTWF0LCAmVGhpcy0+bWF0LCBkd1NpemUpOwoKICAgIHJldHVybiBERF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsMzo6R2V0SGFuZGxlCiAqCiAqIFJldHVybnMgYSBoYW5kbGUgZm9yIHRoZSBtYXRlcmlhbCBpbnRlcmZhY2UuIFRoZSBoYW5kbGUgaXMgc2ltcGx5IGEKICogcG9pbnRlciB0byB0aGUgbWF0ZXJpYWwgaW1wbGVtZW50YXRpb24KICoKICogUGFyYW1zOgogKiAgRGlyZWN0M0REZXZpY2UzOiBUaGUgZGV2aWNlIHRoaXMgaGFuZGxlIGlzIGFzc2lnbmVkIHRvCiAqICBIYW5kbGU6IEFkZHJlc3MgdG8gd3JpdGUgdGhlIGhhbmRsZSB0bwogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgSGFuZGxlIGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX0dldEhhbmRsZShJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTMgKmxwRGlyZWN0M0REZXZpY2UzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRE1BVEVSSUFMSEFORExFICpscEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmRldmljZSA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTMsIGxwRGlyZWN0M0REZXZpY2UzKTsKICAgIFRSQUNFKCIoJXAvJXApLT4oJXAsJXApXG4iLCBUaGlzLCBpZmFjZSwgZGV2aWNlLCBscEhhbmRsZSk7CgogICAgVGhpcy0+YWN0aXZlX2RldmljZSA9IGRldmljZTsKICAgIGlmKCFUaGlzLT5IYW5kbGUpCiAgICB7CiAgICAgICAgVGhpcy0+SGFuZGxlID0gSURpcmVjdDNERGV2aWNlSW1wbF9DcmVhdGVIYW5kbGUoZGV2aWNlKTsKICAgICAgICBpZighVGhpcy0+SGFuZGxlKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJFcnJvciBjcmVhdGluZyBhIGhhbmRsZVxuIik7CiAgICAgICAgICAgIHJldHVybiBEREVSUl9JTlZBTElEUEFSQU1TOyAgIC8qIFVuY2hlY2tlZCAqLwogICAgICAgIH0KICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0ucHRyID0gVGhpczsKICAgICAgICBkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX01hdGVyaWFsOwogICAgfQogICAgKmxwSGFuZGxlID0gVGhpcy0+SGFuZGxlOwogICAgVFJBQ0UoIiByZXR1cm5pbmcgaGFuZGxlICUwOHguXG4iLCAqbHBIYW5kbGUpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRIYW5kbGUoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSwKCQkJCQlMUERJUkVDVDNEREVWSUNFMiBscERpcmVjdDNERGV2aWNlMiwKCQkJCQlMUEQzRE1BVEVSSUFMSEFORExFIGxwSGFuZGxlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEaXJlY3QzRERldmljZTIsIGxwSGFuZGxlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0SGFuZGxlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCgkJCQkJQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIElEaXJlY3QzRERldmljZTMsIGxwRGlyZWN0M0REZXZpY2UyKSwKCQkJCQlscEhhbmRsZSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9HZXRIYW5kbGUoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAoJCQkJCUxQRElSRUNUM0RERVZJQ0UgbHBEaXJlY3QzRERldmljZSwKCQkJCQlMUEQzRE1BVEVSSUFMSEFORExFIGxwSGFuZGxlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBEaXJlY3QzRERldmljZSwgbHBIYW5kbGUpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19HZXRIYW5kbGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAoJCQkJCUNPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIElEaXJlY3QzRERldmljZTMsIGxwRGlyZWN0M0REZXZpY2UpLAoJCQkJCWxwSGFuZGxlKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1F1ZXJ5SW50ZXJmYWNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9icCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9RdWVyeUludGVyZmFjZShMUERJUkVDVDNETUFURVJJQUwgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQqIG9icCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9icCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1F1ZXJ5SW50ZXJmYWNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9BZGRSZWYoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfQWRkUmVmKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0FkZFJlZihMUERJUkVDVDNETUFURVJJQUwgaWZhY2UpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPigpIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0FkZFJlZihDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1JlbGVhc2UoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9SZWxlYXNlKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUmVsZWFzZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfU2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfU2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfU2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19TZXRNYXRlcmlhbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0dldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTDIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldE1hdGVyaWFsKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbWF0ZXJpYWxfYWN0aXZhdGUKICoKICogVXNlcyBJRGlyZWN0M0REZXZpY2U3OjpTZXRNYXRlcmlhbCB0byBhY3RpdmF0ZSB0aGUgbWF0ZXJpYWwKICoKICogUGFyYW1zOgogKiAgVGhpczogUG9pbnRlciB0byB0aGUgbWF0ZXJpYWwgaW1wbGVtZW50YXRpb24gdG8gYWN0aXZhdGUKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIG1hdGVyaWFsX2FjdGl2YXRlKElEaXJlY3QzRE1hdGVyaWFsSW1wbCogVGhpcykKewogICAgRDNETUFURVJJQUw3IGQzZDdtYXQ7CgogICAgVFJBQ0UoIkFjdGl2YXRpbmcgbWF0ZXJpYWwgJXBcbiIsIFRoaXMpOwogICAgZDNkN21hdC51LmRpZmZ1c2UgPSBUaGlzLT5tYXQudS5kaWZmdXNlOwogICAgZDNkN21hdC51MS5hbWJpZW50ID0gVGhpcy0+bWF0LnUxLmFtYmllbnQ7CiAgICBkM2Q3bWF0LnUyLnNwZWN1bGFyID0gVGhpcy0+bWF0LnUyLnNwZWN1bGFyOwogICAgZDNkN21hdC51My5lbWlzc2l2ZSA9IFRoaXMtPm1hdC51My5lbWlzc2l2ZTsKICAgIGQzZDdtYXQudTQucG93ZXIgPSBUaGlzLT5tYXQudTQucG93ZXI7CgogICAgSURpcmVjdDNERGV2aWNlN19TZXRNYXRlcmlhbChJQ09NX0lOVEVSRkFDRShUaGlzLT5hY3RpdmVfZGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmQzZDdtYXQpOwp9Cgpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbDNWdGJsIElEaXJlY3QzRE1hdGVyaWFsM19WdGJsID0KewogICAgLyoqKiBJVW5rbm93biBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9RdWVyeUludGVyZmFjZSwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9BZGRSZWYsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVsZWFzZSwKICAgIC8qKiogSURpcmVjdDNETWF0ZXJpYWwzIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1NldE1hdGVyaWFsLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0dldE1hdGVyaWFsLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0dldEhhbmRsZSwKfTsKCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsMlZ0YmwgSURpcmVjdDNETWF0ZXJpYWwyX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0RNYXRlcmlhbDIgTWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9TZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0dldE1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0SGFuZGxlLAp9OwoKY29uc3QgSURpcmVjdDNETWF0ZXJpYWxWdGJsIElEaXJlY3QzRE1hdGVyaWFsX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfUXVlcnlJbnRlcmZhY2UsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0RNYXRlcmlhbDEgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfSW5pdGlhbGl6ZSwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1NldE1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0TWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9HZXRIYW5kbGUsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVzZXJ2ZSwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9VbnJlc2VydmUKfTsK