LyogRGlyZWN0M0QgTWF0ZXJpYWwKICogQ29weXJpZ2h0IChjKSAyMDAyIExpb25lbCBVTE1FUgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIETWU0lOR0VSCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0M0RNYXRlcmlhbC4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbmUvZXhjZXB0aW9uLmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChkZHJhd190aHVuayk7CgpzdGF0aWMgdm9pZCBkdW1wX21hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMICptYXQpCnsKICAgIERQUklOVEYoIiAgZHdTaXplIDogJWRcbiIsIG1hdC0+ZHdTaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIE1ldGhvZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlF1ZXJ5SW50ZXJmYWNlCiAqCiAqIFF1ZXJ5SW50ZXJmYWNlIGZvciBJRGlyZWN0M0RNYXRlcmlhbC4gQ2FuIHF1ZXJ5IGFsbCBJRGlyZWN0M0RNYXRlcmlhbAogKiB2ZXJzaW9ucy4KICoKICogUGFyYW1zOgogKiAgcmlpZDogSW50ZXJmYWNlIGlkIHF1ZXJpZWQgZm9yCiAqICBvYmo6IEFkZHJlc3MgdG8gcGFzcyB0aGUgaW50ZXJmYWNlIHBvaW50ZXIgYmFjawogKgogKiBSZXR1cm5zOgogKiAgU19PSyBvbiBzdWNjZXNzCiAqICBFX05PSU5URVJGQUNFIGlmIHRoZSByZXF1ZXN0ZWQgaW50ZXJmYWNlIHdhc24ndCBmb3VuZAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEKiBvYnApCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKCiAgICAqb2JwID0gTlVMTDsKCiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lVbmtub3duLCAgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwoJKm9icCA9IGlmYWNlOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNETWF0ZXJpYWwgaW50ZXJmYWNlICVwXG4iLCAqb2JwKTsKCXJldHVybiBTX09LOwogICAgfQogICAgaWYgKCBJc0VxdWFsR1VJRCggJklJRF9JRGlyZWN0M0RNYXRlcmlhbDIsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbF9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwpKTsKICAgICAgICAqb2JwID0gSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNETWF0ZXJpYWwyKTsKCVRSQUNFKCIgIENyZWF0aW5nIElEaXJlY3QzRE1hdGVyaWFsMiBpbnRlcmZhY2UgJXBcbiIsICpvYnApOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBpZiAoIElzRXF1YWxHVUlEKCAmSUlEX0lEaXJlY3QzRE1hdGVyaWFsMywgcmlpZCApICkgewogICAgICAgIElEaXJlY3QzRE1hdGVyaWFsX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbCkpOwogICAgICAgICpvYnAgPSBJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RNYXRlcmlhbDMpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZSAlcFxuIiwgKm9icCk7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIEZJWE1FKCIoJXApOiBpbnRlcmZhY2UgZm9yIElJRCAlcyBOT1QgZm91bmQhXG4iLCBUaGlzLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpKTsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpBZGRSZWYKICoKICogSW5jcmVhc2VzIHRoZSByZWZjb3VudC4KICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9BZGRSZWYoSURpcmVjdDNETWF0ZXJpYWwzICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKTsKICAgIFVMT05HIHJlZiA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApLT4oKSBpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OlJlbGVhc2UKICoKICogUmVkdWNlcyB0aGUgcmVmY291bnQgYnkgb25lLiBJZiB0aGUgcmVmY291bnQgZmFsbHMgdG8gMCwgdGhlIG9iamVjdAogKiBpcyBkZXN0cm95ZWQKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZWxlYXNlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KCkgZGVjcmVtZW50aW5nIGZyb20gJXUuXG4iLCBUaGlzLCByZWYgKyAxKTsKCiAgICBpZiAoIXJlZikKICAgIHsKICAgICAgICBpZihUaGlzLT5IYW5kbGUpCiAgICAgICAgewogICAgICAgICAgICBUaGlzLT5kZHJhdy0+ZDNkZGV2aWNlLT5IYW5kbGVzW1RoaXMtPkhhbmRsZSAtIDFdLnB0ciA9IE5VTEw7CiAgICAgICAgICAgIFRoaXMtPmRkcmF3LT5kM2RkZXZpY2UtPkhhbmRsZXNbVGhpcy0+SGFuZGxlIC0gMV0udHlwZSA9IEREcmF3SGFuZGxlX1Vua25vd247CiAgICAgICAgfQoKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbCBNZXRob2RzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6SW5pdGlhbGl6ZQogKgogKiBBIG5vLW9wIGluaXRpYWxpemF0aW9uCiAqCiAqIFBhcmFtczoKICogIERpcmVjdDNEOiBQb2ludGVyIHRvIGEgRGlyZWN0M0QgaW50ZXJmYWNlCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX0luaXRpYWxpemUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEICpEaXJlY3QzRCkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgaWZhY2UpOwoKICAgIFRSQUNFKCIoJXApLT4oJXApIG5vLW9wLi4uIVxuIiwgVGhpcywgRGlyZWN0M0QpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDo6UmVzZXJ2ZQogKgogKiBEaXJlY3RYIDUgc2RrOiAiVGhlIElEaXJlY3QzRE1hdGVyaWFsMjo6UmVzZXJ2ZSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkIgogKiBPZGQuIFRoZXkgc2VlbSB0byBoYXZlIG1peGVkIHRoZWlyIGludGVyZmFjZXMuCiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfUmVzZXJ2ZShJRGlyZWN0M0RNYXRlcmlhbCAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSBub3QgaW1wbGVtZW50ZWRcbiIsIFRoaXMpOwoKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRE1hdGVyaWFsOjpVbnJlc2VydmUKICoKICogTm90IHN1cHBvcnRlZCB0b28KICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9VbnJlc2VydmUoSURpcmVjdDNETWF0ZXJpYWwgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgbm90IGltcGxlbWVudGVkLlxuIiwgVGhpcyk7CgogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpTZXRNYXRlcmlhbAogKgogKiBTZXRzIHRoZSBtYXRlcmlhbCBkZXNjcmlwdGlvbgogKgogKiBQYXJhbXM6CiAqICBNYXQ6IE1hdGVyaWFsIHRvIHNldAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX0lOVkFMSURQQVJBTVMgaWYgTWF0IGlzIE5VTEwKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNETWF0ZXJpYWxJbXBsX1NldE1hdGVyaWFsKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RNQVRFUklBTCAqbHBNYXQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBNYXQpOwogICAgaWYgKFRSQUNFX09OKGQzZDcpKQogICAgICAgIGR1bXBfbWF0ZXJpYWwobHBNYXQpOwoKICAgIC8qIFN0b3JlcyB0aGUgbWF0ZXJpYWwgKi8KICAgIG1lbXNldCgmVGhpcy0+bWF0LCAwLCBzaXplb2YoVGhpcy0+bWF0KSk7CiAgICBtZW1jcHkoJlRoaXMtPm1hdCwgbHBNYXQsIGxwTWF0LT5kd1NpemUpOwogICAgCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RNYXRlcmlhbDM6OkdldE1hdGVyaWFsCiAqCiAqIFJldHVybnMgdGhlIG1hdGVyaWFsIGFzc2lnbmVkIHRvIHRoaXMgaW50ZXJmYWNlCiAqCiAqIFBhcmFtczoKICogIE1hdDogUG9pbnRlciB0byBhIEQzRE1BVEVSSUFMIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgbWF0ZXJpYWwgZGVzY3JpcHRpb24KICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEREVSUl9JTlZBTElEUEFSQU1TIGlmIE1hdCBpcyBOVUxMCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRE1hdGVyaWFsSW1wbF9HZXRNYXRlcmlhbChJRGlyZWN0M0RNYXRlcmlhbDMgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUwgKmxwTWF0KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgRFdPUkQgZHdTaXplOwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwTWF0KTsKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIFRSQUNFKCIgIFJldHVybmluZyBtYXRlcmlhbCA6ICIpOwogICAgICAgIGR1bXBfbWF0ZXJpYWwoJlRoaXMtPm1hdCk7CiAgICB9CgogICAgLyogQ29waWVzIHRoZSBtYXRlcmlhbCBzdHJ1Y3R1cmUgKi8KICAgIGR3U2l6ZSA9IGxwTWF0LT5kd1NpemU7CiAgICBtZW1zZXQobHBNYXQsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBNYXQsICZUaGlzLT5tYXQsIGR3U2l6ZSk7CgogICAgcmV0dXJuIEREX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNETWF0ZXJpYWwzOjpHZXRIYW5kbGUKICoKICogUmV0dXJucyBhIGhhbmRsZSBmb3IgdGhlIG1hdGVyaWFsIGludGVyZmFjZS4gVGhlIGhhbmRsZSBpcyBzaW1wbHkgYQogKiBwb2ludGVyIHRvIHRoZSBtYXRlcmlhbCBpbXBsZW1lbnRhdGlvbgogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRERldmljZTM6IFRoZSBkZXZpY2UgdGhpcyBoYW5kbGUgaXMgYXNzaWduZWQgdG8KICogIEhhbmRsZTogQWRkcmVzcyB0byB3cml0ZSB0aGUgaGFuZGxlIHRvCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sgb24gc3VjY2VzcwogKiAgRERFUlJfSU5WQUxJRFBBUkFNUyBpZiBIYW5kbGUgaXMgTlVMTAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0SGFuZGxlKElEaXJlY3QzRE1hdGVyaWFsMyAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMyAqbHBEaXJlY3QzRERldmljZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNETUFURVJJQUxIQU5ETEUgKmxwSGFuZGxlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpOwogICAgSURpcmVjdDNERGV2aWNlSW1wbCAqZGV2aWNlID0gSUNPTV9PQkpFQ1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMywgbHBEaXJlY3QzRERldmljZTMpOwogICAgVFJBQ0UoIiglcC8lcCktPiglcCwlcClcbiIsIFRoaXMsIGlmYWNlLCBkZXZpY2UsIGxwSGFuZGxlKTsKCiAgICBUaGlzLT5hY3RpdmVfZGV2aWNlID0gZGV2aWNlOwogICAgaWYoIVRoaXMtPkhhbmRsZSkKICAgIHsKICAgICAgICBUaGlzLT5IYW5kbGUgPSBJRGlyZWN0M0REZXZpY2VJbXBsX0NyZWF0ZUhhbmRsZShkZXZpY2UpOwogICAgICAgIGlmKCFUaGlzLT5IYW5kbGUpCiAgICAgICAgewogICAgICAgICAgICBFUlIoIkVycm9yIGNyZWF0aW5nIGEgaGFuZGxlXG4iKTsKICAgICAgICAgICAgcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7ICAgLyogVW5jaGVja2VkICovCiAgICAgICAgfQogICAgICAgIGRldmljZS0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS5wdHIgPSBUaGlzOwogICAgICAgIGRldmljZS0+SGFuZGxlc1tUaGlzLT5IYW5kbGUgLSAxXS50eXBlID0gRERyYXdIYW5kbGVfTWF0ZXJpYWw7CiAgICB9CiAgICAqbHBIYW5kbGUgPSBUaGlzLT5IYW5kbGU7CiAgICBUUkFDRSgiIHJldHVybmluZyBoYW5kbGUgJTA4eC5cbiIsICpscEhhbmRsZSk7CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0dldEhhbmRsZShMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAoJCQkJCUxQRElSRUNUM0RERVZJQ0UyIGxwRGlyZWN0M0REZXZpY2UyLAoJCQkJCUxQRDNETUFURVJJQUxIQU5ETEUgbHBIYW5kbGUpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlMiwgbHBIYW5kbGUpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19HZXRIYW5kbGUoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKCQkJCQlDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlMiwgSURpcmVjdDNERGV2aWNlMywgbHBEaXJlY3QzRERldmljZTIpLAoJCQkJCWxwSGFuZGxlKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldEhhbmRsZShMUERJUkVDVDNETUFURVJJQUwgaWZhY2UsCgkJCQkJTFBESVJFQ1QzRERFVklDRSBscERpcmVjdDNERGV2aWNlLAoJCQkJCUxQRDNETUFURVJJQUxIQU5ETEUgbHBIYW5kbGUpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCwlcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscERpcmVjdDNERGV2aWNlLCBscEhhbmRsZSk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX0dldEhhbmRsZShDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCgkJCQkJQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZSwgSURpcmVjdDNERGV2aWNlMywgbHBEaXJlY3QzRERldmljZSksCgkJCQkJbHBIYW5kbGUpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUXVlcnlJbnRlcmZhY2UoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JwKTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCogb2JwKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXMsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgZGVidWdzdHJfZ3VpZChyaWlkKSwgb2JwKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfUXVlcnlJbnRlcmZhY2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnApOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0FkZFJlZihMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfQWRkUmVmKExQRElSRUNUM0RNQVRFUklBTCBpZmFjZSkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlKTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfQWRkUmVmKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfUmVsZWFzZShMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsMiwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSkpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1JlbGVhc2UoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlKQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19SZWxlYXNlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9TZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwyIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19TZXRNYXRlcmlhbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbDIsIElEaXJlY3QzRE1hdGVyaWFsMywgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE1hdCk7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9TZXRNYXRlcmlhbChMUERJUkVDVDNETUFURVJJQUwgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRDNETUFURVJJQUwgbHBNYXQpCnsKICAgIFRSQUNFXyhkZHJhd190aHVuaykoIiglcCktPiglcCkgdGh1bmtpbmcgdG8gSURpcmVjdDNETWF0ZXJpYWwzIGludGVyZmFjZS5cbiIsIGlmYWNlLCBscE1hdCk7CiAgICByZXR1cm4gSURpcmVjdDNETWF0ZXJpYWwzX1NldE1hdGVyaWFsKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0M0RNYXRlcmlhbEltcGwsIElEaXJlY3QzRE1hdGVyaWFsLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMMiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRFUklBTCBscE1hdCkKewogICAgVFJBQ0VfKGRkcmF3X3RodW5rKSgiKCVwKS0+KCVwKSB0aHVua2luZyB0byBJRGlyZWN0M0RNYXRlcmlhbDMgaW50ZXJmYWNlLlxuIiwgaWZhY2UsIGxwTWF0KTsKICAgIHJldHVybiBJRGlyZWN0M0RNYXRlcmlhbDNfR2V0TWF0ZXJpYWwoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3QzRE1hdGVyaWFsSW1wbCwgSURpcmVjdDNETWF0ZXJpYWwyLCBJRGlyZWN0M0RNYXRlcmlhbDMsIGlmYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBNYXQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfR2V0TWF0ZXJpYWwoTFBESVJFQ1QzRE1BVEVSSUFMIGlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRE1BVEVSSUFMIGxwTWF0KQp7CiAgICBUUkFDRV8oZGRyYXdfdGh1bmspKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRE1hdGVyaWFsMyBpbnRlcmZhY2UuXG4iLCBpZmFjZSwgbHBNYXQpOwogICAgcmV0dXJuIElEaXJlY3QzRE1hdGVyaWFsM19HZXRNYXRlcmlhbChDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNETWF0ZXJpYWxJbXBsLCBJRGlyZWN0M0RNYXRlcmlhbCwgSURpcmVjdDNETWF0ZXJpYWwzLCBpZmFjZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTWF0KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtYXRlcmlhbF9hY3RpdmF0ZQogKgogKiBVc2VzIElEaXJlY3QzRERldmljZTc6OlNldE1hdGVyaWFsIHRvIGFjdGl2YXRlIHRoZSBtYXRlcmlhbAogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBQb2ludGVyIHRvIHRoZSBtYXRlcmlhbCBpbXBsZW1lbnRhdGlvbiB0byBhY3RpdmF0ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgbWF0ZXJpYWxfYWN0aXZhdGUoSURpcmVjdDNETWF0ZXJpYWxJbXBsKiBUaGlzKQp7CiAgICBEM0RNQVRFUklBTDcgZDNkN21hdDsKCiAgICBUUkFDRSgiQWN0aXZhdGluZyBtYXRlcmlhbCAlcFxuIiwgVGhpcyk7CiAgICBkM2Q3bWF0LnUuZGlmZnVzZSA9IFRoaXMtPm1hdC51LmRpZmZ1c2U7CiAgICBkM2Q3bWF0LnUxLmFtYmllbnQgPSBUaGlzLT5tYXQudTEuYW1iaWVudDsKICAgIGQzZDdtYXQudTIuc3BlY3VsYXIgPSBUaGlzLT5tYXQudTIuc3BlY3VsYXI7CiAgICBkM2Q3bWF0LnUzLmVtaXNzaXZlID0gVGhpcy0+bWF0LnUzLmVtaXNzaXZlOwogICAgZDNkN21hdC51NC5wb3dlciA9IFRoaXMtPm1hdC51NC5wb3dlcjsKCiAgICBJRGlyZWN0M0REZXZpY2U3X1NldE1hdGVyaWFsKElDT01fSU5URVJGQUNFKFRoaXMtPmFjdGl2ZV9kZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZDNkN21hdCk7Cn0KCmNvbnN0IElEaXJlY3QzRE1hdGVyaWFsM1Z0YmwgSURpcmVjdDNETWF0ZXJpYWwzX1Z0YmwgPQp7CiAgICAvKioqIElVbmtub3duIE1ldGhvZHMgKioqLwogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX0FkZFJlZiwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZWxlYXNlLAogICAgLyoqKiBJRGlyZWN0M0RNYXRlcmlhbDMgTWV0aG9kcyAqKiovCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfU2V0TWF0ZXJpYWwsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0TWF0ZXJpYWwsCiAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGxfR2V0SGFuZGxlLAp9OwoKY29uc3QgSURpcmVjdDNETWF0ZXJpYWwyVnRibCBJRGlyZWN0M0RNYXRlcmlhbDJfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRE1hdGVyaWFsMiBNZXRob2RzICoqKi8KICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8yX1NldE1hdGVyaWFsLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzJfR2V0TWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMl9HZXRIYW5kbGUsCn07Cgpjb25zdCBJRGlyZWN0M0RNYXRlcmlhbFZ0YmwgSURpcmVjdDNETWF0ZXJpYWxfVnRibCA9CnsKICAgIC8qKiogSVVua25vd24gTWV0aG9kcyAqKiovCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0FkZFJlZiwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX1JlbGVhc2UsCiAgICAvKioqIElEaXJlY3QzRE1hdGVyaWFsMSBNZXRob2RzICoqKi8KICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9Jbml0aWFsaXplLAogICAgVGh1bmtfSURpcmVjdDNETWF0ZXJpYWxJbXBsXzFfU2V0TWF0ZXJpYWwsCiAgICBUaHVua19JRGlyZWN0M0RNYXRlcmlhbEltcGxfMV9HZXRNYXRlcmlhbCwKICAgIFRodW5rX0lEaXJlY3QzRE1hdGVyaWFsSW1wbF8xX0dldEhhbmRsZSwKICAgIElEaXJlY3QzRE1hdGVyaWFsSW1wbF9SZXNlcnZlLAogICAgSURpcmVjdDNETWF0ZXJpYWxJbXBsX1VucmVzZXJ2ZQp9Owo=