LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0IAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24KICoKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBkaXNjbGFpbWVyIGJlbG93LgogKgogKiBBdG1lbCdzIG5hbWUgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRElTQ0xBSU1FUjogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBVE1FTCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFCiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFUTUVMIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsCiAqIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAogKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFx1bml0Ci8vLwovLy8gIVB1cnBvc2UKLy8vIAovLy8gQ0NJRCBkcml2ZXIKLy8vIAovLy8gIVVzYWdlCi8vLyAKLy8vIEV4cGxhbmF0aW9uIG9uIHRoZSB1c2FnZSBvZiB0aGUgY29kZSBtYWRlIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBoZWFkZXIgZmlsZS4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgIEhlYWRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpbmNsdWRlICJib2FyZC5oIgojaW5jbHVkZSAic2ltdHJhY2UuaCIKCiNpZmRlZiBIQVZFX0NDSUQKCiNpbmNsdWRlIDxVU0JERHJpdmVyLmg+CiNpbmNsdWRlIDxVU0JSZXF1ZXN0cy5oPgojaW5jbHVkZSA8VVNCRGVzY3JpcHRvcnMuaD4KLy8jaW5jbHVkZSA8dXNiL2RldmljZS9kZnUvZGZ1Lmg+CiNpbmNsdWRlIDxjY2lkZHJpdmVyZGVzY3JpcHRvcnMuaD4KCi8vIEZJWE1FOiBSZW1vdmUgREZVIHJlbGF0ZWQgc3R1ZmYgCi8qIG5vIERGVSBib290bG9hZGVyIGlzIGJlaW5nIHVzZWQgKi8KI2RlZmluZSBERlVfTlVNX0lGICAgICAgMAojZGVmaW5lIERGVV9JRl9ERVNDUklQVE9SU19TVFJVQ1QKI2RlZmluZSBERlVfSUZfREVTQ1JJUFRPUlMKCiNkZWZpbmUgREZVX05VTV9TVFJJTkdTIDAKI2RlZmluZSBERlVfU1RSSU5HX0RFU0NSSVBUT1JTCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIExvY2FsIGRlZmluaXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHByb2R1Y3QgSUQuCi8vI2RlZmluZSBDQ0lERHJpdmVyRGVzY3JpcHRvcnNfUFJPRFVDVElEICAgICAgIDB4NjEyOQojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19QUk9EVUNUSUQgICAgICAgU0lNVFJBQ0VfUFJPRFVDVF9JRAovLy8gQ29uc3RhbnRzOiBJRHM6IERldmljZSB2ZW5kb3IgSUQuCiNkZWZpbmUgQ0NJRERyaXZlckRlc2NyaXB0b3JzX1ZFTkRPUklEICAgICAgICBBVE1FTF9WRU5ET1JfSUQKLy8jZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19WRU5ET1JJRCAgICAgICAgMHgwM0VCCi8vLyBDb25zdGFudHM6IElEczogRGV2aWNlIHJlbGVhc2UgbnVtYmVyLgojZGVmaW5lIENDSUREcml2ZXJEZXNjcmlwdG9yc19SRUxFQVNFICAgICAgICAgMHgwMTAwCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgIFR5cGVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLy8gRHJpdmVyIHN0cnVjdHVyZSBmb3IgYW4gQ0NJRCBkZXZpY2UKdHlwZWRlZiBzdHJ1Y3QgewoKCS8vLyBDQ0lEIG1lc3NhZ2UKCVNfY2NpZF9idWxrX2luX2hlYWRlciAgc0NjaWRNZXNzYWdlOwoJLy8vIENDSUQgY29tbWFuZAoJU19jY2lkX2J1bGtfb3V0X2hlYWRlciBzQ2NpZENvbW1hbmQ7CgkvLy8gSW50ZXJydXB0IG1lc3NhZ2UgYW5zd2VyCgl1bnNpZ25lZCBjaGFyICAgICAgICAgIEJ1ZmZlcklOVFs0XTsKCS8vLyBCdWZmZXIgZGF0YSBvZiBtZXNzYWdlCgl1bnNpZ25lZCBjaGFyICAgICAgICAgIFByb3RvY29sRGF0YVN0cnVjdHVyZVsxMF07CgkvLy8gUHJvdG9jb2wgdXNlZAoJdW5zaWduZWQgY2hhciAgICAgICAgICBiUHJvdG9jb2w7CgkvLy8gU2xvdFN0YXR1cwoJLy8vIEJpdCAwID0gU2xvdCAwIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgMSA9IFNsb3QgMCBjaGFuZ2VkIHN0YXR1cwoJLy8vIEJpdCAyID0gU2xvdCAxIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgMyA9IFNsb3QgMSBjaGFuZ2VkIHN0YXR1cwoJLy8vIEJpdCA0ID0gU2xvdCAyIGN1cnJlbnQgc3RhdGUKCS8vLyBCaXQgNSA9IFNsb3QgMiBjaGFuZ2VkIHN0YXR1cwoJdW5zaWduZWQgY2hhciAgICAgICAgICBTbG90U3RhdHVzOwoKfSBDQ0lERHJpdmVyOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICBMb2NhbCB2YXJpYWJsZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLyBTdGF0aWMgaW5zdGFuY2Ugb2YgdGhlIENDSUQgZGV2aWNlIGRyaXZlci4Kc3RhdGljIENDSUREcml2ZXIgY2NpZERyaXZlcjsKc3RhdGljIENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICBJbnRlcm5hbCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBJbml0aWFsaXplcyB0aGUgQ0NJRCBkZXZpY2UgZHJpdmVyLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSUREcml2ZXJfSW5pdGlhbGl6ZSggdm9pZCApCnsKCWNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTID0gKENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKikgY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzQXJyW0NGR19OVU1fQ0NJRC0xXTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIFJldHVybiB0aGUgU2xvdCBTdGF0dXMgdG8gdGhlIGhvc3QKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0ljY1Bvd2VyT2ZmCi8vLyAgIFBDX3RvX1JEUl9HZXRTbG90U3RhdHVzCi8vLyAgIFBDX3RvX1JEUl9JY2NDbG9jawovLy8gICBQQ190b19SRFJfVDBBUERVCi8vLyAgIFBDX3RvX1JEUl9NZWNoYW5pY2FsCi8vLyAgIFBDX3RvX1JEUl9BYm9ydCBhbmQgQ2xhc3Mgc3BlY2lmaWMgQUJPUlQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDU2xvdFN0YXR1cyggdm9pZCApCnsKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19TTE9UU1RBVFVTOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gMDsKCglpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19JTlNFUlRFRF9FVkVOVCkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOyAgICAvKiBJQ0MgcHJlc2VudCBhbmQgYWN0aXZlIGNhcmQgKi8KCX0gZWxzZSBpZiAoY2NpZERyaXZlci5TbG90U3RhdHVzID09IElDQ19OT1RfUFJFU0VOVCkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAyOyAgICAvKiBObyBJQ0MgcHJlc2VudCovCgl9IGVsc2V7CgkJVFJBQ0VfRVJST1IoIlN0cmFuZ2UgYlN0YXR1cyIpOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJfQoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICAgID0gMDsKCS8vIDAwaCBDbG9jayBydW5uaW5nCgkvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCgkvLyAwMmggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBICgkvLyAwM2ggQ2xvY2sgc3RvcHBlZCBpbiBhbiB1bmtub3duIHN0YXRlCgkvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG8gUENfdG9fUkRSX0ljY1Bvd2VyT24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ0RhdGFibG9ja19BVFIoIHZvaWQgKQp7Cgl1bnNpZ25lZCBjaGFyIGk7Cgl1bnNpZ25lZCBjaGFyIEF0cltBVFJfU0laRV9NQVhdOwoJdW5zaWduZWQgY2hhciBsZW5ndGg7Cgl1aW50MzJfdCBzdGF0dXM7IAoKCVRSQUNFX0RFQlVHKCIuIik7CgoJc3RhdHVzID0gSVNPNzgxNl9EYXRhYmxvY2tfQVRSKCBBdHIsICZsZW5ndGggKTsKCUlTTzc4MTZfRGVjb2RlX0FUUiggQXRyICk7CgoJaWYgKHN0YXR1cyA9PSAwKSB7CgkJVFJBQ0VfREVCVUcoIlRpbWVvdXQgb2NjdXJlZCB3aGlsZSByZWFkaW5nIEFUUiIpOwovLyBGSVhNRTogcmVhY3QgcHJvcGVybHkgdG8gdGltZW91dC4uCi8vICAgICAgICByZXR1cm47Cgl9CgovLyBGSVhNRTogTW9yZSB0ZXN0cz8gSXMgYlByb3RvY29sID0gQXRyWzNdID8KCWlmKCBsZW5ndGggPiA1ICkgewoJCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID0gQXRyWzNdJjB4MEY7IC8vIFREKDEpCgkJY2NpZERyaXZlci5iUHJvdG9jb2wgPSBBdHJbM10mMHgwRjsgICAgICAgICAgIC8vIFREKDEpCgkJVFJBQ0VfSU5GTygiUHJvdG9jb2wgZGF0YSBzdHJ1Y3R1cmU6IDB4JXhcblxyIiwKCQkJCQkgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwoJfQoKCS8vIFNfY2NpZF9wcm90b2NvbF90MAoJLy8gYm1GaW5kZXhEaW5kZXgKCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzBdID0gQXRyWzJdOyAgICAgLy8gVEEoMSkKCgkvLyBibVRDQ0tTVDAKCS8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCgkvLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQoKCS8vIGJHdWFyZFRpbWVUMAoJLy8gRXh0cmEgR3VhcmR0aW1lIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMuIEFkZCAwIHRvIDI1NCBldHUgdG8gdGhlIG5vcm1hbCAKCS8vIGd1YXJkdGltZSBvZiAxMmV0dS4gRkZoIGlzIHRoZSBzYW1lIGFzIDAwaC4KCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzJdID0gQXRyWzRdOyAgICAgLy8gVEMoMSkKCS8vIEFUOTFDX0JBU0VfVVMwLT5VU19UVEdSID0gMDsgIC8vIFRDMQoKCS8vIGJXYWl0aW5nSW50ZWdlclQwCgkvLyBXSSBmb3IgVD0wIHVzZWQgdG8gZGVmaW5lIFdXVAoJY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbM10gPSBBdHJbN107ICAgICAvLyBUQygyKQoKCS8vIGJDbG9ja1N0b3AKCS8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKCS8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCgkvLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93CgkvLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAoJLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CgljY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVs0XSA9IDB4MDA7ICAgICAgIC8vIDAgdG8gMwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKCS8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCglmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKCgkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldICA9IEF0cltpXTsKCX0KCgkvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVzcG9uc2UgUGlwZSwgQnVsay1JTiBNZXNzYWdlcwovLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSByZXNwb25zZSBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogCi8vLyBUaGUgcmVzcG9uc2UgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIG9wdGlvbmFsIGRhdGEgcmV0dXJuZWQgYnkgdGhlIElDQywgCi8vLyBmb2xsb3dlZCBieSB0aGUgMiBieXRlLXNpemUgc3RhdHVzIHdvcmRzIFNXMS1TVzIuCi8vLwovLy8gQW5zd2VyIHRvOgovLy8gICBQQ190b19SRFJfWGZyQmxvY2sKLy8vICAgUENfdG9fUkRSX1NlY3VyZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrKCB2b2lkICkKewoJLy9UUkFDRV9ERUJVRygiLiIpOwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOwoJLy8gYkNoYWluUGFyYW1ldGVyOiAwMCB0aGUgcmVzcG9uc2UgQVBEVSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhpcyBjb21tYW5kCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOwoKCS8vIFNldCB0aGUgc2xvdCB0byBhbiBhY3RpdmUgc3RhdHVzCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86Ci8vLyAgIFBDX3RvX1JEUl9HZXRQYXJhbWV0ZXJzCi8vLyAgIFBDX3RvX1JEUl9SZXNldFBhcmFtZXRlcnMKLy8vICAgUENfdG9fUkRSX1NldFBhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUkRSdG9QQ1BhcmFtZXRlcnMoIHZvaWQgKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglUUkFDRV9ERUJVRygiLiIpOwoKCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19QQVJBTUVURVJTOwoKCS8vY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCglpZiggY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8gKSB7CgoJCS8vIFQ9MAoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDApOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1RPOwoJfQoJZWxzZSB7CgoJCS8vIFQ9MQoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDEpOwoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1QxOwoJfQoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CgoJZm9yKCBpPTA7IGk8Y2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsgaSsrICkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlW2ldOwoJfQoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlc3BvbnNlIFBpcGUsIEJ1bGstSU4gTWVzc2FnZXMKLy8vIEFuc3dlciB0bzoKLy8vICAgUENfdG9fUkRSX0VzY2FwZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRXNjYXBlKCB1bnNpZ25lZCBjaGFyIGxlbmd0aCwgdW5zaWduZWQgY2hhciAqZGF0YV9zZW5kX2Zyb21fQ0NJRCApCnsKCXVuc2lnbmVkIGludCBpOwoKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0VTQ0FQRTsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBsZW5ndGg7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgID0gMDsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQoKCWZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgewoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGRhdGFfc2VuZF9mcm9tX0NDSURbaV07Cgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBSZXNwb25zZSBQaXBlLCBCdWxrLUlOIE1lc3NhZ2VzCi8vLyBBbnN3ZXIgdG86IAovLy8gICBQQ190b19SRFJfU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3ksIAoJCQkJCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZSApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX0RBVEFSQVRFQU5EQ0xPQ0tGUkVRVUVOQ1k7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gODsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IDA7ICAvLyBiUkZVCgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdID0gZHdDbG9ja0ZyZXF1ZW5jeTsKCQoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdID0gZHdEYXRhUmF0ZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFBvd2VyIE9uIENvbW1hbmQgLSBDb2xkIFJlc2V0ICYgV2FybSBSZXNldCAKLy8vIFJldHVybiB0aGUgQVRSIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9uKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCWlmKCBDQ0lEX0ZFQVRVUkVTX0FVVE9fVk9MVCA9PSAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAmIENDSURfRkVBVFVSRVNfQVVUT19WT0xUKSApIHsKCgkJLy9iUG93ZXJTZWxlY3QgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKCQljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCA9IFZPTFRTX0FVVE87Cgl9CgoJSVNPNzgxNl93YXJtX3Jlc2V0KCk7Ci8vICAgIElTTzc4MTZfY29sZF9yZXNldCgpOwoKCS8vIGZvciBlbXVsYXRpb24gb25seSAvL0pDQiAKCWlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgIT0gVk9MVFNfNV8wICkgewoKCQlUUkFDRV9FUlJPUigiUE9XRVJfTk9UX1NVUFBPUlRFRFxuXHIiKTsKCX0KCgllbHNlIHsKCgkJUkRSdG9QQ0RhdGFibG9ja19BVFIoKTsKCgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBQb3dlciBPZmYgQ29tbWFuZCAtIFNldCB0aGUgSUNDIGluIGFuIGluYWN0aXZlIHN0YXRlCi8vLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJJY2NQb3dlck9mZiggdm9pZCApCnsKCXVuc2lnbmVkIGNoYXIgYlN0YXR1czsKCglUUkFDRV9ERUJVRygiLiIpOwoKCUlTTzc4MTZfSWNjUG93ZXJPZmYoKTsKCgkvL0pDQiBzdHViCgliU3RhdHVzID0gSUNDX0JTX1BSRVNFTlRfTk9UQUNUSVZBVEVEOwoKCS8vIFNldCB0aGUgc2xvdCB0byBhbiBpbmFjdGl2ZSBzdGF0dXMKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCgkvLyBpZiBlcnJvciwgc2VlIFRhYmxlIDYuMS0yIGVycm9ycwoKCS8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKCVJEUnRvUENTbG90U3RhdHVzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBHZXQgc2xvdCBzdGF0dXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFNsb3RTdGF0dXMoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKCgkvLyBSZXR1cm4gdGhlIHNsb3Qgc3RhdHVzIHRvIHRoZSBob3N0CglSRFJ0b1BDU2xvdFN0YXR1cygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gSWYgdGhlIGNvbW1hbmQgaGVhZGVyIGlzIHZhbGlkLCBhbiBBUERVIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGNhbiBiZSByZWFkCi8vLyBieSB0aGUgYXBwbGljYXRpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUlhmckJsb2NrKCB2b2lkICkKewoJdWludDE2X3QgbXNnbGVuID0gMDsKCXVpbnQzMl90IHJldDsKCglUUkFDRV9ERUJVRygiUEN0b1JEUlhmckJsb2NrXG4iKTsKCgkvLyBDaGVjayB0aGUgYmxvY2sgbGVuZ3RoCglpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGggPiAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdNYXhDQ0lETWVzc2FnZUxlbmd0aC0xMCkgKSB7CgkJVFJBQ0VfREVCVUcoIkVyciBibG9jay9tc2cgbGVuIik7CgkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDE7CgkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7Cgl9CgkvLyBjaGVjayBiQldJCgllbHNlIGlmICggMCAhPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKCgkJIFRSQUNFX0VSUk9SKCJCYWQgYkJXSVxuXHIiKTsKCX0KCWVsc2UgewoKCQkvLyBBUERVIG9yIFRQRFUKCQlzd2l0Y2goY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAKCQkJICAmIChDQ0lEX0ZFQVRVUkVTX0VYQ19UUERVfENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpKSB7CgoJCQljYXNlIENDSURfRkVBVFVSRVNfRVhDX1RQRFU6CgkJCQlpZiAoY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8pIHsKCQkJCQlUUkFDRV9ERUJVRygiQVBEVSBjbWQ6ICV4ICV4ICV4IC4uIiwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVswXSwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXSxjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzJdICk7CgoJCQkJCS8vIFNlbmQgY29tbWFuZGUgQVBEVQoJCQkJCXJldCA9IElTTzc4MTZfWGZyQmxvY2tUUERVX1QwKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVICwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGEsCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAmbXNnbGVuICk7CgkJCQkJaWYgKHJldCAhPSAwKSB7CgkJCQkJICAgIFRSQUNFX0VSUk9SKCJBUERVIGNvdWxkIG5vdCBiZSBzZW50OiAoVVNfQ1NSID0gMHgleCkiLCByZXQpOwoJCQkJCSAgICByZXR1cm47CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJaWYgKGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1QxKSB7CgkJCQkJICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIFQ9MVxuXHIiKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIDB4JXhcblxyIiwgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwoJCQkJCX0KCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVOgoJCQkJVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgQ0NJRF9GRUFUVVJFU19FWENfQVBEVVxuXHIiKTsKCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCX0KCgl9CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCA9IG1zZ2xlbjsKCVRSQUNFX0RFQlVHKCJVU0I6IDB4JVgsIDB4JVgsIDB4JVgsIDB4JVgsIDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdLCAKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMV0sIAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVsyXSwgCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzNdLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSApOwoJIFJEUnRvUENEYXRhYmxvY2soKTsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyByZXR1cm4gcGFyYW1ldGVycyBieSB0aGUgY29tbWFuZDogUkRSX3RvX1BDX1BhcmFtZXRlcnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkdldFBhcmFtZXRlcnMoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCS8vIFdlIHN1cHBvcnQgb25seSBvbmUgc2xvdAoKCS8vIGJtSWNjU3RhdHVzCglpZiggSVNPNzgxNl9TdGF0dXNSZXNldCgpICkgewoJCS8vIDA6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKHBvd2VyIGlzIG9uIGFuZCBzdGFibGUsIFJTVCBpcyBpbmFjdGl2ZQoJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoJfQoJZWxzZSB7CgkJLy8gMTogQW4gSUNDIGlzIHByZXNlbnQgYW5kIGluYWN0aXZlIChub3QgYWN0aXZhdGVkIG9yIHNodXQgZG93biBieSBoYXJkd2FyZSBlcnJvcikKCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKCX0KCglSRFJ0b1BDUGFyYW1ldGVycygpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHJlc2V0cyB0aGUgc2xvdCBwYXJhbWV0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJSZXNldFBhcmFtZXRlcnMoIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCWNjaWREcml2ZXIuU2xvdFN0YXR1cyA9IElDQ19OT1RfUFJFU0VOVDsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CgoJUkRSdG9QQ1BhcmFtZXRlcnMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBzbG90LgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2V0UGFyYW1ldGVycyggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJY2NpZERyaXZlci5TbG90U3RhdHVzID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gY2NpZERyaXZlci5TbG90U3RhdHVzOwoJLy8gTm90IGFsbCBmZWF0dXJlIHN1cHBvcnRlZAoKCVJEUnRvUENQYXJhbWV0ZXJzKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBDQ0lEIG1hbnVmYWN0dXJlciB0byBkZWZpbmUgYW5kIGFjY2VzcyBleHRlbmRlZCAKLy8vIGZlYXR1cmVzLiAKLy8vIEluZm9ybWF0aW9uIHNlbnQgdmlhIHRoaXMgY29tbWFuZCBpcyBwcm9jZXNzZWQgYnkgdGhlIENDSUQgY29udHJvbCBsb2dpYy4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUkVzY2FwZSggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJLy8gSWYgbmVlZGVkIGJ5IHRoZSB1c2VyCglJU083ODE2X0VzY2FwZSgpOwoKCS8vIHN0dWIsIHJldHVybiBhbGwgdmFsdWUgc2VuZAoJUkRSdG9QQ0VzY2FwZSggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVSk7ICAgIAp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gQ29tbWFuZCBQaXBlLCBCdWxrLU9VVCBNZXNzYWdlcwovLy8gVGhpcyBjb21tYW5kIHN0b3BzIG9yIHJlc3RhcnRzIHRoZSBjbG9jay4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgUEN0b1JEUklDQ0Nsb2NrKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCglpZiggMCA9PSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKCQkvLyByZXN0YXJ0cyB0aGUgY2xvY2sKCQlJU083ODE2X1Jlc3RhcnRDbG9jaygpOwoJfQoJZWxzZSB7CgkJLy8gc3RvcCBjbG9jayBpbiB0aGUgc3RhdGUgc2hvd24gaW4gdGhlIGJDbG9ja1N0b3AgZmllbGQKCQlJU083ODE2X1N0b3BDbG9jaygpOwoJfQoKCVJEUnRvUENTbG90U3RhdHVzKCApOyAgICAKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBjaGFuZ2VzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gcGVyZm9ybSB0aGUgdHJhbnNwb3J0YXRpb24gb2YgCi8vLyBBUERVIG1lc3NhZ2VzIGJ5IHRoZSBUPTAgcHJvdG9jb2wuIAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSdG9BUERVKCB2b2lkICkKewoJdW5zaWduZWQgY2hhciBibUNoYW5nZXM7Cgl1bnNpZ25lZCBjaGFyIGJDbGFzc0dldFJlc3BvbnNlOwoJdW5zaWduZWQgY2hhciBiQ2xhc3NFbnZlbG9wZTsKCglUUkFDRV9JTkZPKCIuIik7CgoJaWYoIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpICkgewoKCQlibUNoYW5nZXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKCQliQ2xhc3NHZXRSZXNwb25zZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xOwoJCWJDbGFzc0VudmVsb3BlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzI7CgoJCUlTTzc4MTZfdG9BUERVKCk7Cgl9CgoJUkRSdG9QQ1Nsb3RTdGF0dXMoKTsgICAgCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGlzIGEgY29tbWFuZCBtZXNzYWdlIHRvIGFsbG93IGVudGVyaW5nIHRoZSBQSU4gZm9yIHZlcmlmaWNhdGlvbiBvcgovLy8gbW9kaWZpY2F0aW9uLgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzdGF0aWMgdm9pZCBQQ3RvUkRSU2VjdXJlKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCglUUkFDRV9ERUJVRygiRm9yIHVzZXJcblxyIik7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBDb21tYW5kIFBpcGUsIEJ1bGstT1VUIE1lc3NhZ2VzCi8vLyBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBtYW5hZ2UgbW90b3JpemVkIHR5cGUgQ0NJRCBmdW5jdGlvbmFsaXR5LiAKLy8vIFRoZSBMb2NrIENhcmQgZnVuY3Rpb24gaXMgdXNlZCB0byBob2xkIHRoZSBJQ0MuIAovLy8gVGhpcyBwcmV2ZW50cyBhbiBJQ0MgZnJvbSBiZWluZyBlYXNpbHkgcmVtb3ZlZCBmcm9tIHRoZSBDQ0lELiAKLy8vIFRoZSBVbmxvY2sgQ2FyZCBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSB0aGUgaG9sZCBpbml0aWF0ZWQgYnkgdGhlIExvY2sgCi8vLyBDYXJkIGZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJNZWNoYW5pY2FsKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCVRSQUNFX0RFQlVHKCJOb3QgaW1wbGVtZW50ZWRcblxyIik7CgoJUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHdpdGggdGhlIENvbnRyb2wgcGlwZSBBYm9ydCByZXF1ZXN0IHRvIHRlbGwgdGhlIENDSUQgCi8vLyB0byBzdG9wIGFueSBjdXJyZW50IHRyYW5zZmVyIGF0IHRoZSBzcGVjaWZpZWQgc2xvdCBhbmQgcmV0dXJuIHRvIGEgc3RhdGUgCi8vLyB3aGVyZSB0aGUgc2xvdCBpcyByZWFkeSB0byBhY2NlcHQgYSBuZXcgY29tbWFuZCBwaXBlIEJ1bGstT1VUIG1lc3NhZ2UuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJBYm9ydCggdm9pZCApCnsKCVRSQUNFX0RFQlVHKCIuIik7CgoJUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIENvbW1hbmQgUGlwZSwgQnVsay1PVVQgTWVzc2FnZXMKLy8vIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIG1hbnVhbGx5IHNldCB0aGUgZGF0YSByYXRlIGFuZCBjbG9jayBmcmVxdWVuY3kgb2YgCi8vLyBhIHNwZWNpZmljIHNsb3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIFBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCB2b2lkICkKewoJdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3k7Cgl1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZTsKCglUUkFDRV9ERUJVRygiLiIpOwoKCWR3Q2xvY2tGcmVxdWVuY3kgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdCgkJCQkJICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMV08PDgpCgkJCQkJICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl08PDE2KQoJCQkJCSArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzNdPDwyNCk7CgoJZHdEYXRhUmF0ZSA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNF0KCQkJICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs1XTw8OCkKCQkJICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs2XTw8MTYpCgkJCSAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbN108PDI0KTsKCglJU083ODE2X1NldERhdGFSYXRlYW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKCglSRFJ0b1BDRGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggZHdDbG9ja0ZyZXF1ZW5jeSwgZHdEYXRhUmF0ZSApOwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFJlcG9ydCB0aGUgQ01EX05PVF9TVVBQT1JURUQgZXJyb3IgdG8gdGhlIGhvc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCB2b2lkICkKewoJLy8gQ29tbWFuZCBub3Qgc3VwcG9ydGVkCgkvLyB2Q0NJRFJlcG9ydEVycm9yKENNRF9OT1RfU1VQUE9SVEVEKTsKCglUUkFDRV9ERUJVRygiQ01EX05PVF9TVVBQT1JURURcblxyIik7CgoJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgICAgPSAwOwoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKCgljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzIHw9IElDQ19DU19GQUlMRUQ7CgoJLy8gU2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIGhvc3QKCS8vdkNDSURTZW5kUmVzcG9uc2UoKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8vIFNlbnQgQ0NJRCByZXNwb25zZSBvbiBVU0IKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgdkNDSURTZW5kUmVzcG9uc2UoIHZvaWQgKQp7Cgl1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CglUUkFDRV9ERUJVRygiLiIpOwoKCWRvIHsKCQliU3RhdHVzID0gQ0NJRF9Xcml0ZSgodm9pZCopJmNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLAoJCQkJCSAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCwgMCwgMCApOwoJfSB3aGlsZSAoYlN0YXR1cyAhPSBVU0JEX1NUQVRVU19TVUNDRVNTKTsKCglUUkFDRV9ERUJVRygiYlN0YXR1czogMHgleFxuXHIiLCBiU3RhdHVzKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyAgRGVzY3JpcHRpb246IENDSUQgQ29tbWFuZCBkaXNwYXRjaGVyCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyB2b2lkIENDSURDb21tYW5kRGlzcGF0Y2hlciggdm9pZCAqcEFyZywgdWludDhfdCBzdGF0dXMsIHVpbnQzMl90IHRyYW5zZmVycmVkLCB1aW50MzJfdCByZW1haW5pbmcgKQp7Cgl1bnNpZ25lZCBjaGFyIE1lc3NhZ2VUb1NlbmQgPSAwOwoKCWlmIChzdGF0dXMgIT0gVVNCRF9TVEFUVVNfU1VDQ0VTUykgewoJCVRSQUNFX0VSUk9SKCJVU0IgZXJyb3I6ICVkIiwgc3RhdHVzKTsKCQlyZXR1cm47Cgl9CglUUkFDRV9ERUJVRygiQ29tbWFuZDogMHglWCAweCV4IDB4JVggMHglWCAweCVYIDB4JVggMHglWFxuXHJcblxyIiwKCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlLAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdCwKCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcSwKCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAsCgkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18xLAoJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMik7CgoJLy8gQ2hlY2sgdGhlIHNsb3QgbnVtYmVyCglpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKCgkJVFJBQ0VfRVJST1IoIkJBRF9TTE9UX05VTUJFUlxuXHIiKTsKCX0KCglUUkFDRV9JTkZPKCJ0eXA9MHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwoKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTbG90ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3Q7CgoJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CgoKCS8vIENvbW1hbmQgZGlzcGF0Y2hlcgoJc3dpdGNoICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlICkgewoKCQljYXNlIFBDX1RPX1JEUl9JQ0NQT1dFUk9OOgoJCQlQQ3RvUkRSSWNjUG93ZXJPbigpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST0ZGOgoJCQlQQ3RvUkRSSWNjUG93ZXJPZmYoKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9HRVRTTE9UU1RBVFVTOgoJCQlQQ3RvUkRSR2V0U2xvdFN0YXR1cygpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1hGUkJMT0NLOgoJCQlQQ3RvUkRSWGZyQmxvY2soKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9HRVRQQVJBTUVURVJTOgoJCQlQQ3RvUkRSR2V0UGFyYW1ldGVycygpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1JFU0VUUEFSQU1FVEVSUzoKCQkJUEN0b1JEUlJlc2V0UGFyYW1ldGVycygpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1NFVFBBUkFNRVRFUlM6CgkJCVBDdG9SRFJTZXRQYXJhbWV0ZXJzKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfRVNDQVBFOgoJCQlQQ3RvUkRSRXNjYXBlKCk7CgkJCU1lc3NhZ2VUb1NlbmQgPSAxOwoJCQlicmVhazsKCgkJY2FzZSBQQ19UT19SRFJfSUNDQ0xPQ0s6CgkJCVBDdG9SRFJJQ0NDbG9jaygpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX1QwQVBEVToKCQkJLy8gT25seSBDQ0lEcyByZXBvcnRpbmcgYSBzaG9ydCBvciBleHRlbmRlZCBBUERVIGxldmVsIGluIHRoZSBkd0ZlYXR1cmVzIAoJCQkvLyBmaWVsZCBvZiB0aGUgQ0NJRCBjbGFzcyBkZXNjcmlwdG9yIG1heSB0YWtlIHRoaXMgY29tbWFuZCBpbnRvIGFjY291bnQuCgkJCWlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQoJCQl8fCAoQ0NJRF9GRUFUVVJFU19FWENfQVBEVSAgPT0gKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKSApIHsKCgkJCQkvLyBjb21tYW5kIHN1cHBvcnRlZAoJCQkJUEN0b1JEUnRvQVBEVSgpOwoJCQl9CgkJCWVsc2UgewoJCQkJLy8gY29tbWFuZCBub3Qgc3VwcG9ydGVkCgkJCQlUUkFDRV9JTkZPKCJOb3Qgc3VwcG9ydGVkOiBQQ19UT19SRFJfVDBBUERVXG5cciIpOwoJCQkJdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CgkJCX0KCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9TRUNVUkU6CgkJCVBDdG9SRFJTZWN1cmUoKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9NRUNIQU5JQ0FMOgoJCQlQQ3RvUkRSTWVjaGFuaWNhbCgpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWNhc2UgUENfVE9fUkRSX0FCT1JUOgoJCQlQQ3RvUkRSQWJvcnQoKTsKCQkJTWVzc2FnZVRvU2VuZCA9IDE7CgkJCWJyZWFrOwoKCQljYXNlIFBDX1RPX1JEUl9TRVREQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOgoJCQlQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSgpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCVRSQUNFX0RFQlVHKCJkZWZhdWx0OiBOb3Qgc3VwcG9ydGVkOiAweCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CgkJCXZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCgpOwoJCQlNZXNzYWdlVG9TZW5kID0gMTsKCQkJYnJlYWs7CgoJfQoKCWlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7CgkJdkNDSURTZW5kUmVzcG9uc2UoKTsKCX0KfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTRVRVUCByZXF1ZXN0IGhhbmRsZXIgZm9yIGEgQ0NJRCBkZXZpY2UKLy8vIFxwYXJhbSBwUmVxdWVzdCBQb2ludGVyIHRvIGEgVVNCR2VuZXJpY1JlcXVlc3QgaW5zdGFuY2UKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHZvaWQgQ0NJRF9SZXF1ZXN0SGFuZGxlcihjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcFJlcXVlc3QpCnsKCVRSQUNFX0RFQlVHKCJDQ0lEX1JIbFxuXHIiKTsKCgkvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xhc3MgcmVxdWVzdAoJaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X0NMQVNTKSB7CgoJCS8vIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN1cHBvcnRlZAoJCXN3aXRjaCAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpIHsKCgkJCWNhc2UgQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUOgoJCQkJVFJBQ0VfREVCVUcoIkNDSURHZW5lcmljUmVxdWVzdF9BQk9SVFxuXHIiKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgoJCQkJVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQ6IENDSURHZW5lcmljUmVxdWVzdF9HRVRfQ0xPQ0tfRlJFUVVFTkNJRVNcblxyIik7CgkJCQkvLyBBIENDSUQgd2l0aCBiTnVtQ2xvY2tTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCgkJCQkvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAoJCQkJYnJlYWs7CgoJCQljYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKCQkJCVRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0RBVEFfUkFURVNcblxyIik7CgkJCQkvLyBBIENDSUQgd2l0aCBiTnVtRGF0YVJhdGVzU3VwcG9ydGVkIGVxdWFsIHRvIDAwaCBkb2VzIG5vdCBoYXZlIAoJCQkJLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQlUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCAoJWQpXG5cciIsCgkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSk7CgkJCQlVU0JEX1N0YWxsKDApOwoJCX0KCX0KCgllbHNlIGlmIChVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9TVEFOREFSRCkgewoKCQkvLyBGb3J3YXJkIHJlcXVlc3QgdG8gdGhlIHN0YW5kYXJkIGhhbmRsZXIKCQlVU0JERHJpdmVyX1JlcXVlc3RIYW5kbGVyKFVTQkRfR2V0RHJpdmVyKCksIHBSZXF1ZXN0KTsKCX0KCWVsc2UgewoKCQkvLyBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUKCQlUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCB0eXBlICglZClcblxyIiwKCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpKTsKCQlVU0JEX1N0YWxsKDApOwoJfQp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICBFeHBvcnRlZCBmdW5jdGlvbnMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBPcHRpb25hbCBjYWxsYmFjayByZS1pbXBsZW1lbnRhdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojaWYgIWRlZmluZWQoTk9BVVRPQ0FMTEJBQ0spCi8vIG5vdCBzdGF0aWMgZnVuY3Rpb24Kdm9pZCBVU0JEQ2FsbGJhY2tzX1JlcXVlc3RSZWNlaXZlZChjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcmVxdWVzdCkKewoJQ0NJRF9SZXF1ZXN0SGFuZGxlcihyZXF1ZXN0KTsKfQojZW5kaWYKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSGFuZGxlcyBTbWFydENhcnQgcmVxdWVzdAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIENDSURfU21hcnRDYXJkUmVxdWVzdCggdm9pZCApCnsKCXVuc2lnbmVkIGNoYXIgYlN0YXR1czsKCVRSQUNFX0RFQlVHKCJDQ0lEX3JlcVxuIik7CgoJZG8gewoKCQliU3RhdHVzID0gQ0NJRF9SZWFkKCAodm9pZCopJmNjaWREcml2ZXIuc0NjaWRDb21tYW5kLAoJCQkJCSAgICAgICAgIHNpemVvZihTX2NjaWRfYnVsa19vdXRfaGVhZGVyKSwKCQkJCQkgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykmQ0NJRENvbW1hbmREaXNwYXRjaGVyLAoJCQkJCSAgICAgICAgICh2b2lkKikwICk7Cgl9Cgl3aGlsZSAoMCk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gUmVhZHMgZGF0YSBmcm9tIHRoZSBEYXRhIE9VVCBlbmRwb2ludAovLy8gXHBhcmFtIHBCdWZmZXIgICBCdWZmZXIgdG8gc3RvcmUgdGhlIHJlY2VpdmVkIGRhdGEKLy8vIFxwYXJhbSBkTGVuZ3RoICAgZGF0YSBidWZmZXIgbGVuZ3RoCi8vLyBccGFyYW0gZkNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccGFyYW0gcEFyZ3VtZW50IE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9SZWFkKHZvaWQgKnBCdWZmZXIsCgkJCQkJICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAoJCQkJCSAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKCQkJCQkgICAgdm9pZCAqcEFyZ3VtZW50KQp7CglyZXR1cm4gVVNCRF9SZWFkKENDSURfRVBUX0RBVEFfT1VULCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIERhdGEgSU4gZW5kcG9pbnQKLy8vIFxwYXJhbSBwQnVmZmVyICAgQnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgdG8gdHJhbnNtaXQKLy8vIFxwYXJhbSBkTGVuZ3RoICAgTGVuZ3RoIG9mIGRhdGEgYnVmZmVyCi8vLyBccGFyYW0gZkNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccGFyYW0gcEFyZ3VtZW50IE9wdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9Xcml0ZSh2b2lkICpwQnVmZmVyLAoJCQkJCSAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCgkJCQkJICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKCQkJCQkgICAgIHZvaWQgKnBBcmd1bWVudCkKewoJcmV0dXJuIFVTQkRfV3JpdGUoQ0NJRF9FUFRfREFUQV9JTiwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gU2VuZHMgZGF0YSB0aHJvdWdoIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQsIElDQyBpbnNlcnRpb24gZXZlbnQKLy8vIFJEUl90b19QQ19Ob3RpZnlTbG90Q2hhbmdlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9JbnNlcnRpb24oIHZvaWQgKQp7CglUUkFDRV9ERUJVRygiLiIpOwoKCS8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQoJY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfTk9USUZZU0xPVENIQU5HRTsKCWNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX0lOU0VSVEVEX0VWRU5UOwoJY2NpZERyaXZlci5TbG90U3RhdHVzICAgPSBJQ0NfSU5TRVJURURfRVZFTlQ7CgoJLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKCXJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCAyLCAwLCAwICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLyBTZW5kcyBkYXRhIHRocm91Z2ggdGhlIGludGVycnVwdCBlbmRwb2ludCwgSUNDIHJlbW92YWwgZXZlbnQKLy8vIFJEUl90b19QQ19Ob3RpZnlTbG90Q2hhbmdlCi8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnVuc2lnbmVkIGNoYXIgQ0NJRF9SZW1vdmFsKCB2b2lkICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCgkvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKCWNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX05PVElGWVNMT1RDSEFOR0U7CgljY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IElDQ19OT1RfUFJFU0VOVDsKCWNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX05PVF9QUkVTRU5UOwoKCS8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCglyZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy8gSW50ZXJydXB0LUlOIE1lc3NhZ2VzCi8vLyBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGFueSBiaXQgaW4gdGhlIGJIYXJkd2FyZUVycm9yQ29kZSBmaWVsZCBpcyBzZXQuIAovLy8gSWYgdGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiB0aGVyZSBpcyBubyCTb3V0c3RhbmRpbmeUIGNvbW1hbmQsIHRoZSBiU2VxIAovLy8gZmllbGQgd2lsbCBiZSB1bmRlZmluZWQuCi8vLyBccGFyYW0gYlNsb3QgSUNDIHNsb3QgbnVtYmVyCi8vLyBccGFyYW0gYlNlcSAgU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBidWxrIE9VVCBjb21tYW5kIHdoZW4gdGhlIGhhcmR3YXJlIGVycm9yCi8vLyBvY2N1cmVkCi8vLyBccGFyYW0gYkhhcmR3YXJlRXJyb3JDb2RlIEhhcmR3YXJlIGVycm9yIGNvZGUKLy8vIFxyZXR1cm4gVVNCRF9TVEFUVVNfTE9DS0VEIG9yIFVTQkRfU1RBVFVTX1NVQ0NFU1MKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdW5zaWduZWQgY2hhciBSRFJ0b1BDSGFyZHdhcmVFcnJvciggdW5zaWduZWQgY2hhciBiU2xvdCwgCgkJCQkJICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYlNlcSwgCgkJCQkJICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYkhhcmR3YXJlRXJyb3JDb2RlICkKewoJVFJBQ0VfREVCVUcoIi4iKTsKCgkvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKCWNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX0hBUkRXQVJFRVJST1I7CgljY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IGJTbG90OwoJY2NpZERyaXZlci5CdWZmZXJJTlRbMl0gPSBiU2VxOwoJY2NpZERyaXZlci5CdWZmZXJJTlRbM10gPSBiSGFyZHdhcmVFcnJvckNvZGU7CgoJLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKCXJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCA0LCAwLCAwICk7Cn0KCiNlbmRpZiAvKiBIQVZFX0NDSUQgKi8K