LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgKGMpIFNZU1RFQyBlbGVjdHJvbmljIEdtYkgsIEQtMDc5NzMgR3JlaXosIEF1Z3VzdC1CZWJlbC1TdHIuIDI5CiAgICAgIHd3dy5zeXN0ZWMtZWxlY3Ryb25pYy5jb20KCiAgUHJvamVjdDogICAgICBvcGVuUE9XRVJMSU5LCgogIERlc2NyaXB0aW9uOiAgc291cmNlIGZpbGUgZm9yIEVwbC1Vc2Vyc3BhY2UtRXZlbnQtTW9kdWwKCiAgTGljZW5zZToKCiAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICAgYXJlIG1ldDoKCiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1lTVEVDIGVsZWN0cm9uaWMgR21iSCBub3IgdGhlIG5hbWVzIG9mIGl0cwogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCiAgICAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQHN5c3RlYy1lbGVjdHJvbmljLmNvbS4KCiAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAgICBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICAgIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCiAgICBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAgICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCiAgICBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICAgIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCiAgICBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKICAgIFNldmVyYWJpbGl0eSBDbGF1c2U6CgogICAgICAgIElmIGEgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBvciBiZWNvbWVzIGlsbGVnYWwsIGludmFsaWQgb3IKICAgICAgICB1bmVuZm9yY2VhYmxlIGluIGFueSBqdXJpc2RpY3Rpb24sIHRoYXQgc2hhbGwgbm90IGFmZmVjdDoKICAgICAgICAxLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gdGhhdCBqdXJpc2RpY3Rpb24gb2YgYW55IG90aGVyCiAgICAgICAgICAgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZTsgb3IKICAgICAgICAyLiB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgaW4gb3RoZXIganVyaXNkaWN0aW9ucyBvZiB0aGF0IG9yCiAgICAgICAgICAgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UuCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgICAkUkNTZmlsZTogRXBsRXZlbnR1LmMsdiAkCgogICAgICAgICAgICAgICAgJEF1dGhvcjogRC5LcnVlZ2VyICQKCiAgICAgICAgICAgICAgICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwOC8xMS8xNyAxNjo0MDozOSAkCgogICAgICAgICAgICAgICAgJFN0YXRlOiBFeHAgJAoKICAgICAgICAgICAgICAgIEJ1aWxkIEVudmlyb25tZW50OgogICAgICAgICAgICAgICAgICAgIEdDQyBWMy40CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgUmV2aXNpb24gSGlzdG9yeToKCiAgMjAwNi8wNi8yMCBrLnQuOiAgIHN0YXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJ1c2VyL0VwbEV2ZW50dS5oIgojaW5jbHVkZSAidXNlci9FcGxObXR1LmgiCiNpbmNsdWRlICJ1c2VyL0VwbE5tdE1udS5oIgojaW5jbHVkZSAidXNlci9FcGxTZG9Bc3lTZXF1LmgiCiNpbmNsdWRlICJ1c2VyL0VwbERsbHVDYWwuaCIKI2luY2x1ZGUgInVzZXIvRXBsTGVkdS5oIgojaW5jbHVkZSAiQmVuY2htYXJrLmgiCgojaWZkZWYgRVBMX05PX0ZJRk8KI2luY2x1ZGUgImtlcm5lbC9FcGxFdmVudGsuaCIKI2Vsc2UKI2luY2x1ZGUgIlNoYXJlZEJ1ZmYuaCIKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICBHIEwgTyBCIEEgTCAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29uc3QgZGVmaW5lcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gVHJhY2VQb2ludCBzdXBwb3J0IGZvciByZWFsdGltZS1kZWJ1Z2dpbmcKI2lmZGVmIF9EQkdfVFJBQ0VfUE9JTlRTXwp2b2lkIFBVQkxJQyBUZ3REYmdTaWduYWxUcmFjZVBvaW50KEJZVEUgYlRyYWNlUG9pbnROdW1iZXJfcCk7CnZvaWQgUFVCTElDIFRndERiZ1Bvc3RUcmFjZVZhbHVlKERXT1JEIGR3VHJhY2VWYWx1ZV9wKTsKI2RlZmluZSBUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVChwKSAgIFRndERiZ1NpZ25hbFRyYWNlUG9pbnQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikgICAgIFRndERiZ1Bvc3RUcmFjZVZhbHVlKHYpCiNlbHNlCiNkZWZpbmUgVEdUX0RCR19TSUdOQUxfVFJBQ0VfUE9JTlQocCkKI2RlZmluZSBUR1RfREJHX1BPU1RfVFJBQ0VfVkFMVUUodikKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBsb2NhbCB0eXBlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgewojaWZuZGVmIEVQTF9OT19GSUZPCgl0U2hiSW5zdGFuY2UgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2U7Cgl0U2hiSW5zdGFuY2UgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2U7CiNlbmRpZgoJdEVwbFByb2Nlc3NFdmVudENiIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2I7Cgp9IHRFcGxFdmVudHVJbnN0YW5jZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG1vZHVsIGdsb2JhbGUgdmFycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8jaWZuZGVmIEVQTF9OT19GSUZPCnN0YXRpYyB0RXBsRXZlbnR1SW5zdGFuY2UgRXBsRXZlbnR1SW5zdGFuY2VfZzsKLy8jZW5kaWYKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgRVBMX05PX0ZJRk8KLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGluY29tbWluZyBldmVudHMKc3RhdGljIHZvaWQgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IodFNoYkluc3RhbmNlIHBTaGJSeEluc3RhbmNlX3AsCgkJCQkgICAgICAgdW5zaWduZWQgbG9uZyB1bERhdGFTaXplX3ApOwojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgIEMgTCBBIFMgUyAgPEVwbC1Vc2VyLUV2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vCi8vIERlc2NyaXB0aW9uOgovLwovLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgUCBVIEIgTCBJIEMgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVJbml0Ci8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBmaXJzdCBpbnN0YW5jZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOiAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCAgPSBmdW5jdGlvbiBwb2ludGVyIGZvciBBUEkgZXZlbnQgY2FsbGJhY2sKLy8KLy8KLy8gUmV0dXJuczogICAgICB0RXBLZXJuZWwgID0gZXJyb3Jjb2RlCi8vCi8vCi8vIFN0YXRlOgovLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp0RXBsS2VybmVsIFBVQkxJQyBFcGxFdmVudHVJbml0KHRFcGxQcm9jZXNzRXZlbnRDYiBwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKQp7Cgl0RXBsS2VybmVsIFJldDsKCglSZXQgPSBFcGxFdmVudHVBZGRJbnN0YW5jZShwZm5BcGlQcm9jZXNzRXZlbnRDYl9wKTsKCglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dUFkZEluc3RhbmNlCi8vCi8vIERlc2NyaXB0aW9uOiBmdW5jdGlvbiBhZGQgb25lIG1vcmUgaW5zdGFuY2UKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBmbkFwaVByb2Nlc3NFdmVudENiX3AgID0gZnVuY3Rpb24gcG9pbnRlciBmb3IgQVBJIGV2ZW50IGNhbGxiYWNrCi8vCi8vCi8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1QWRkSW5zdGFuY2UodEVwbFByb2Nlc3NFdmVudENiCgkJCQkgICAgICAgcGZuQXBpUHJvY2Vzc0V2ZW50Q2JfcCkKewoJdEVwbEtlcm5lbCBSZXQ7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJFcnJvciBTaGJFcnJvcjsKCXVuc2lnbmVkIGludCBmU2hiTmV3Q3JlYXRlZDsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gaW5pdCBpbnN0YW5jZSB2YXJpYWJsZXMKCUVwbEV2ZW50dUluc3RhbmNlX2cubV9wZm5BcGlQcm9jZXNzRXZlbnRDYiA9IHBmbkFwaVByb2Nlc3NFdmVudENiX3A7CgojaWZuZGVmIEVQTF9OT19GSUZPCgkvLyBpbml0IHNoYXJlZCBsb29wIGJ1ZmZlcgoJLy8ga2VybmVsIC0+IHVzZXIKCVNoYkVycm9yID0gU2hiQ2lyQWxsb2NCdWZmZXIoRVBMX0VWRU5UX1NJWkVfU0hCX0tFUk5FTF9UT19VU0VSLAoJCQkJICAgICBFUExfRVZFTlRfTkFNRV9TSEJfS0VSTkVMX1RPX1VTRVIsCgkJCQkgICAgICZFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJICAgICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCSAgICAgJmZTaGJOZXdDcmVhdGVkKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJBbGxvY0J1ZmZlcihLMlUpIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoKCS8vIHVzZXIgLT4ga2VybmVsCglTaGJFcnJvciA9IFNoYkNpckFsbG9jQnVmZmVyKEVQTF9FVkVOVF9TSVpFX1NIQl9VU0VSX1RPX0tFUk5FTCwKCQkJCSAgICAgRVBMX0VWRU5UX05BTUVfU0hCX1VTRVJfVE9fS0VSTkVMLAoJCQkJICAgICAmRXBsRXZlbnR1SW5zdGFuY2VfZy4KCQkJCSAgICAgbV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UsCgkJCQkgICAgICZmU2hiTmV3Q3JlYXRlZCk7CglpZiAoU2hiRXJyb3IgIT0ga1NoYk9rKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnR1QWRkSW5zdGFuY2UoKTogU2hiQ2lyQWxsb2NCdWZmZXIoVTJLKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlZ2lzdGVyIGV2ZW50aGFuZGxlcgoJU2hiRXJyb3IgPQoJICAgIFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJICBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCQkgIEVwbEV2ZW50dVJ4U2lnbmFsSGFuZGxlckNiLAoJCQkJCSAga1NoYlByaW9yaXR5Tm9ybWFsKTsKCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQlFUExfREJHTFZMX0VWRU5US19UUkFDRTEKCQkgICAgKCJFcGxFdmVudHVBZGRJbnN0YW5jZSgpOiBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShLMlUpIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CgkJZ290byBFeGl0OwoJfQoKICAgICAgRXhpdDoKI2VuZGlmCgoJcmV0dXJuIFJldDsKCn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEZ1bmN0aW9uOiAgICBFcGxFdmVudHVEZWxJbnN0YW5jZQovLwovLyBEZXNjcmlwdGlvbjogZnVuY3Rpb24gZGVsZXRlIGluc3RhbmNlIGFuIGZyZWUgdGhlIGJ1ZmZlcnN0cnVjdHVyZQovLwovLwovLwovLyBQYXJhbWV0ZXJzOgovLwovLwovLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dURlbEluc3RhbmNlKCkKewoJdEVwbEtlcm5lbCBSZXQ7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCXRTaGJFcnJvciBTaGJFcnJvcjsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgojaWZuZGVmIEVQTF9OT19GSUZPCgkvLyBzZXQgZXZlbnRoYW5kbGVyIHRvIE5VTEwKCVNoYkVycm9yID0KCSAgICBTaGJDaXJTZXRTaWduYWxIYW5kbGVyTmV3RGF0YShFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJCSAgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsIE5VTEwsCgkJCQkJICBrU2hiUHJpb3JpdHlOb3JtYWwpOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclNldFNpZ25hbEhhbmRsZXJOZXdEYXRhKEsyVSkgLT4gMHglWFxuIiwKCQkgICAgIFNoYkVycm9yKTsKCQlSZXQgPSBrRXBsTm9SZXNvdXJjZTsKCX0KCS8vIGZyZWUgYnVmZmVyIFVzZXIgLT4gS2VybmVsCglTaGJFcnJvciA9CgkgICAgU2hiQ2lyUmVsZWFzZUJ1ZmZlcihFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlKTsKCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKSAmJiAoU2hiRXJyb3IgIT0ga1NoYk1lbVVzZWRCeU90aGVyUHJvY3MpKSB7CgkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJICAgICgiRXBsRXZlbnR1RGVsSW5zdGFuY2UoKTogU2hiQ2lyUmVsZWFzZUJ1ZmZlcihVMkspIC0+IDB4JVhcbiIsCgkJICAgICBTaGJFcnJvcik7CgkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7Cgl9IGVsc2UgewoJCUVwbEV2ZW50dUluc3RhbmNlX2cubV9wU2hiVXNlclRvS2VybmVsSW5zdGFuY2UgPSBOVUxMOwoJfQoKCS8vIGZyZWUgYnVmZmVyICBLZXJuZWwgLT4gVXNlcgoJU2hiRXJyb3IgPQoJICAgIFNoYkNpclJlbGVhc2VCdWZmZXIoRXBsRXZlbnR1SW5zdGFuY2VfZy5tX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSk7CglpZiAoKFNoYkVycm9yICE9IGtTaGJPaykgJiYgKFNoYkVycm9yICE9IGtTaGJNZW1Vc2VkQnlPdGhlclByb2NzKSkgewoJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCSAgICAoIkVwbEV2ZW50dURlbEluc3RhbmNlKCk6IFNoYkNpclJlbGVhc2VCdWZmZXIoSzJVKSAtPiAweCVYXG4iLAoJCSAgICAgU2hiRXJyb3IpOwoJCVJldCA9IGtFcGxOb1Jlc291cmNlOwoJfSBlbHNlIHsKCQlFcGxFdmVudHVJbnN0YW5jZV9nLm1fcFNoYktlcm5lbFRvVXNlckluc3RhbmNlID0gTlVMTDsKCX0KCiNlbmRpZgoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UHJvY2VzcwovLwovLyBEZXNjcmlwdGlvbjogS2VybmVsdGhyZWFkIHRoYXQgZGlzcGF0Y2hlcyBldmVudHMgaW4ga2VybmVsc3BhY2UKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgovLwovLwovLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVByb2Nlc3ModEVwbEV2ZW50ICogcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwoJdEVwbEV2ZW50U291cmNlIEV2ZW50U291cmNlOwoKCVJldCA9IGtFcGxTdWNjZXNzZnVsOwoKCS8vIGNoZWNrIG1fRXZlbnRTaW5rCglzd2l0Y2ggKHBFdmVudF9wLT5tX0V2ZW50U2luaykgewoJCS8vIE5NVC1Vc2VyLU1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKCQl7CiNpZiAoKChFUExfTU9EVUxFX0lOVEVHUkFUSU9OKSAmIChFUExfTU9EVUxFX05NVFUpKSAhPSAwKQoJCQlSZXQgPSBFcGxObXR1UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXR1OwoKCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCUVwbEV2ZW50dVBvc3RFcnJvcihrRXBsRXZlbnRTb3VyY2VFdmVudHUsCgkJCQkJCSAgIFJldCwKCQkJCQkJICAgc2l6ZW9mKEV2ZW50U291cmNlKSwKCQkJCQkJICAgJkV2ZW50U291cmNlKTsKCQkJfQojZW5kaWYKCQkJYnJlYWs7CgkJfQoKI2lmKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9OTVRfTU4pKSAhPSAwKQoJCS8vIE5NVC1NTi1Vc2VyLU1vZHVsZQoJY2FzZSBrRXBsRXZlbnRTaW5rTm10TW51OgoJCXsKCQkJUmV0ID0gRXBsTm10TW51UHJvY2Vzc0V2ZW50KHBFdmVudF9wKTsKCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpICYmIChSZXQgIT0ga0VwbFNodXRkb3duKSkgewoJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VObXRNbnU7CgoJCQkJLy8gRXJyb3IgZXZlbnQgZm9yIEFQSSBsYXllcgoJCQkJRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKCQkJCQkJICAgUmV0LAoJCQkJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQl9CgkJCWJyZWFrOwoJCX0KI2VuZGlmCgojaWYgKCgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPQykpICE9IDApICAgXAogICAgIHx8ICgoKEVQTF9NT0RVTEVfSU5URUdSQVRJT04pICYgKEVQTF9NT0RVTEVfU0RPUykpICE9IDApKQoJCS8vIGV2ZW50cyBmb3IgYXN5bmNocm9udXMgU0RPIFNlcXVlbmNlIExheWVyCgljYXNlIGtFcGxFdmVudFNpbmtTZG9Bc3lTZXE6CgkJewoJCQlSZXQgPSBFcGxTZG9Bc3lTZXFQcm9jZXNzRXZlbnQocEV2ZW50X3ApOwoJCQlpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQlFdmVudFNvdXJjZSA9IGtFcGxFdmVudFNvdXJjZVNkb0FzeVNlcTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KCQkJYnJlYWs7CgkJfQojZW5kaWYKCgkJLy8gTEVEIHVzZXIgcGFydCBtb2R1bGUKCWNhc2Uga0VwbEV2ZW50U2lua0xlZHU6CgkJewojaWYgKCgoRVBMX01PRFVMRV9JTlRFR1JBVElPTikgJiAoRVBMX01PRFVMRV9MRURVKSkgIT0gMCkKCQkJUmV0ID0gRXBsTGVkdVByb2Nlc3NFdmVudChwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlTGVkdTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KI2VuZGlmCgkJCWJyZWFrOwoJCX0KCgkJLy8gZXZlbnQgZm9yIEVQTCBhcGkKCWNhc2Uga0VwbEV2ZW50U2lua0FwaToKCQl7CgkJCWlmIChFcGxFdmVudHVJbnN0YW5jZV9nLm1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IgIT0gTlVMTCkgewoJCQkJUmV0ID0KCQkJCSAgICBFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJICAgIG1fcGZuQXBpUHJvY2Vzc0V2ZW50Q2IocEV2ZW50X3ApOwoJCQkJaWYgKChSZXQgIT0ga0VwbFN1Y2Nlc3NmdWwpCgkJCQkgICAgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKSB7CgkJCQkJRXZlbnRTb3VyY2UgPSBrRXBsRXZlbnRTb3VyY2VFcGxBcGk7CgoJCQkJCS8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJCQlFcGxFdmVudHVQb3N0RXJyb3IKCQkJCQkgICAgKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwgUmV0LAoJCQkJCSAgICAgc2l6ZW9mKEV2ZW50U291cmNlKSwgJkV2ZW50U291cmNlKTsKCQkJCX0KCQkJfQoJCQlicmVhazsKCgkJfQoKCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CgkJewoJCQlSZXQgPSBFcGxEbGx1Q2FsUHJvY2VzcyhwRXZlbnRfcCk7CgkJCWlmICgoUmV0ICE9IGtFcGxTdWNjZXNzZnVsKSAmJiAoUmV0ICE9IGtFcGxTaHV0ZG93bikpIHsKCQkJCUV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRGxsdTsKCgkJCQkvLyBFcnJvciBldmVudCBmb3IgQVBJIGxheWVyCgkJCQlFcGxFdmVudHVQb3N0RXJyb3Ioa0VwbEV2ZW50U291cmNlRXZlbnR1LAoJCQkJCQkgICBSZXQsCgkJCQkJCSAgIHNpemVvZihFdmVudFNvdXJjZSksCgkJCQkJCSAgICZFdmVudFNvdXJjZSk7CgkJCX0KCQkJYnJlYWs7CgoJCX0KCgljYXNlIGtFcGxFdmVudFNpbmtFcnJ1OgoJCXsKCQkJLyoKCQkJICAgUmV0ID0gRXBsRXJydVByb2Nlc3MocEV2ZW50X3ApOwoJCQkgICBpZiAoKFJldCAhPSBrRXBsU3VjY2Vzc2Z1bCkgJiYgKFJldCAhPSBrRXBsU2h1dGRvd24pKQoJCQkgICB7CgkJCSAgIEV2ZW50U291cmNlID0ga0VwbEV2ZW50U291cmNlRXJydTsKCgkJCSAgIC8vIEVycm9yIGV2ZW50IGZvciBBUEkgbGF5ZXIKCQkJICAgRXBsRXZlbnR1UG9zdEVycm9yKGtFcGxFdmVudFNvdXJjZUV2ZW50dSwKCQkJICAgUmV0LAoJCQkgICBzaXplb2YoRXZlbnRTb3VyY2UpLAoJCQkgICAmRXZlbnRTb3VyY2UpOwoJCQkgICB9CgkJCSAqLwoJCQlicmVhazsKCgkJfQoKCQkvLyB1bmtub3duIHNpbmsKCWRlZmF1bHQ6CgkJewoJCQlSZXQgPSBrRXBsRXZlbnRVbmtub3duU2luazsKCQl9CgoJfQkJCS8vIGVuZCBvZiBzd2l0Y2gocEV2ZW50X3AtPm1fRXZlbnRTaW5rKQoKCXJldHVybiBSZXQ7Cgp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UG9zdAovLwovLyBEZXNjcmlwdGlvbjogcG9zdCBldmVudHMgZnJvbSB1c2Vyc3BhY2UKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBFdmVudF9wID0gcG9pbnRlciB0byBldmVudC1zdHJ1Y3R1ciBmcm9tIGJ1ZmZlcgovLwovLwovLyBSZXR1cm5zOiAgICAgIHRFcEtlcm5lbCAgPSBlcnJvcmNvZGUKLy8KLy8KLy8gU3RhdGU6Ci8vCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRFcGxLZXJuZWwgUFVCTElDIEVwbEV2ZW50dVBvc3QodEVwbEV2ZW50ICogcEV2ZW50X3ApCnsKCXRFcGxLZXJuZWwgUmV0OwojaWZuZGVmIEVQTF9OT19GSUZPCgl0U2hiRXJyb3IgU2hiRXJyb3I7Cgl0U2hiQ2lyQ2h1bmsgU2hiQ2lyQ2h1bms7Cgl1bnNpZ25lZCBsb25nIHVsRGF0YVNpemU7Cgl1bnNpZ25lZCBpbnQgZkJ1ZmZlckNvbXBsZXRlZDsKI2VuZGlmCgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgojaWZuZGVmIEVQTF9OT19GSUZPCgkvLyAyMDA2LzA4LzAzIGQuay46IEV2ZW50IGFuZCBhcmd1bWVudCBhcmUgcG9zdGVkIGFzIHNlcGFyYXRlIGNodW5rcyB0byB0aGUgZXZlbnQgcXVldWUuCgl1bERhdGFTaXplID0KCSAgICBzaXplb2YodEVwbEV2ZW50KSArCgkgICAgKChwRXZlbnRfcC0+bV9wQXJnICE9IE5VTEwpID8gcEV2ZW50X3AtPm1fdWlTaXplIDogMCk7CiNlbmRpZgoKCS8vIGRlY2lkZSBpbiB3aGljaCBidWZmZXIgdGhlIGV2ZW50IGhhdmUgdG8gd3JpdGUKCXN3aXRjaCAocEV2ZW50X3AtPm1fRXZlbnRTaW5rKSB7CgkJLy8ga2VybmVsc3BhY2UgbW9kdWxlcwoJY2FzZSBrRXBsRXZlbnRTaW5rU3luYzoKCWNhc2Uga0VwbEV2ZW50U2lua05tdGs6CgljYXNlIGtFcGxFdmVudFNpbmtEbGxrOgoJY2FzZSBrRXBsRXZlbnRTaW5rRGxsa0NhbDoKCWNhc2Uga0VwbEV2ZW50U2lua1Bkb2s6CgljYXNlIGtFcGxFdmVudFNpbmtFcnJrOgoJCXsKI2lmbmRlZiBFUExfTk9fRklGTwoJCQkvLyBwb3N0IG1lc3NhZ2UKCQkJU2hiRXJyb3IgPQoJCQkgICAgU2hiQ2lyQWxsb2NEYXRhQmxvY2soRXBsRXZlbnR1SW5zdGFuY2VfZy4KCQkJCQkJIG1fcFNoYlVzZXJUb0tlcm5lbEluc3RhbmNlLAoJCQkJCQkgJlNoYkNpckNodW5rLCB1bERhdGFTaXplKTsKCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpckFsbG9jRGF0YUJsb2NrKFUySykgLT4gMHglWFxuIiwKCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOwoJCQkJZ290byBFeGl0OwoJCQl9CgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgcEV2ZW50X3AsCgkJCQkJCSBzaXplb2YodEVwbEV2ZW50KSwKCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkgICAgKCJFcGxFdmVudHVQb3N0KCk6IFNoYkNpcldyaXRlRGF0YUNodW5rKFUySykgLT4gMHglWFxuIiwKCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJUmV0ID0ga0VwbEV2ZW50UG9zdEVycm9yOwoJCQkJZ290byBFeGl0OwoJCQl9CgkJCWlmIChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSB7CgkJCQlTaGJFcnJvciA9CgkJCQkgICAgU2hiQ2lyV3JpdGVEYXRhQ2h1bmsoRXBsRXZlbnR1SW5zdGFuY2VfZy4KCQkJCQkJCSBtX3BTaGJVc2VyVG9LZXJuZWxJbnN0YW5jZSwKCQkJCQkJCSAmU2hiQ2lyQ2h1bmssCgkJCQkJCQkgcEV2ZW50X3AtPm1fcEFyZywKCQkJCQkJCSAodW5zaWduZWQgbG9uZykKCQkJCQkJCSBwRXZlbnRfcC0+bV91aVNpemUsCgkJCQkJCQkgJmZCdWZmZXJDb21wbGV0ZWQpOwoJCQkJaWYgKChTaGJFcnJvciAhPSBrU2hiT2spCgkJCQkgICAgfHwgKGZCdWZmZXJDb21wbGV0ZWQgPT0gRkFMU0UpKSB7CgkJCQkJRVBMX0RCR0xWTF9FVkVOVEtfVFJBQ0UxCgkJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuazIoVTJLKSAtPiAweCVYXG4iLAoJCQkJCSAgICAgU2hiRXJyb3IpOwoJCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCQlnb3RvIEV4aXQ7CgkJCQl9CgkJCX0KI2Vsc2UKCQkJUmV0ID0gRXBsRXZlbnRrUHJvY2VzcyhwRXZlbnRfcCk7CiNlbmRpZgoKCQkJYnJlYWs7CgkJfQoKCQkvLyB1c2Vyc3BhY2UgbW9kdWxlcwoJY2FzZSBrRXBsRXZlbnRTaW5rTm10TW51OgoJY2FzZSBrRXBsRXZlbnRTaW5rTm10dToKCWNhc2Uga0VwbEV2ZW50U2lua1Nkb0FzeVNlcToKCWNhc2Uga0VwbEV2ZW50U2lua0FwaToKCWNhc2Uga0VwbEV2ZW50U2lua0RsbHVDYWw6CgljYXNlIGtFcGxFdmVudFNpbmtFcnJ1OgoJY2FzZSBrRXBsRXZlbnRTaW5rTGVkdToKCQl7CiNpZm5kZWYgRVBMX05PX0ZJRk8KCQkJLy8gcG9zdCBtZXNzYWdlCgkJCVNoYkVycm9yID0KCQkJICAgIFNoYkNpckFsbG9jRGF0YUJsb2NrKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJCSBtX3BTaGJLZXJuZWxUb1VzZXJJbnN0YW5jZSwKCQkJCQkJICZTaGJDaXJDaHVuaywgdWxEYXRhU2l6ZSk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJBbGxvY0RhdGFCbG9jayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlTaGJFcnJvciA9CgkJCSAgICBTaGJDaXJXcml0ZURhdGFDaHVuayhFcGxFdmVudHVJbnN0YW5jZV9nLgoJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCSAmU2hiQ2lyQ2h1bmssIHBFdmVudF9wLAoJCQkJCQkgc2l6ZW9mKHRFcGxFdmVudCksCgkJCQkJCSAmZkJ1ZmZlckNvbXBsZXRlZCk7CgkJCWlmIChTaGJFcnJvciAhPSBrU2hiT2spIHsKCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJICAgICgiRXBsRXZlbnR1UG9zdCgpOiBTaGJDaXJXcml0ZURhdGFDaHVuayhLMlUpIC0+IDB4JVhcbiIsCgkJCQkgICAgIFNoYkVycm9yKTsKCQkJCVJldCA9IGtFcGxFdmVudFBvc3RFcnJvcjsKCQkJCWdvdG8gRXhpdDsKCQkJfQoJCQlpZiAoZkJ1ZmZlckNvbXBsZXRlZCA9PSBGQUxTRSkgewoJCQkJU2hiRXJyb3IgPQoJCQkJICAgIFNoYkNpcldyaXRlRGF0YUNodW5rKEVwbEV2ZW50dUluc3RhbmNlX2cuCgkJCQkJCQkgbV9wU2hiS2VybmVsVG9Vc2VySW5zdGFuY2UsCgkJCQkJCQkgJlNoYkNpckNodW5rLAoJCQkJCQkJIHBFdmVudF9wLT5tX3BBcmcsCgkJCQkJCQkgKHVuc2lnbmVkIGxvbmcpCgkJCQkJCQkgcEV2ZW50X3AtPm1fdWlTaXplLAoJCQkJCQkJICZmQnVmZmVyQ29tcGxldGVkKTsKCQkJCWlmICgoU2hiRXJyb3IgIT0ga1NoYk9rKQoJCQkJICAgIHx8IChmQnVmZmVyQ29tcGxldGVkID09IEZBTFNFKSkgewoJCQkJCUVQTF9EQkdMVkxfRVZFTlRLX1RSQUNFMQoJCQkJCSAgICAoIkVwbEV2ZW50dVBvc3QoKTogU2hiQ2lyV3JpdGVEYXRhQ2h1bmsyKEsyVSkgLT4gMHglWFxuIiwKCQkJCQkgICAgIFNoYkVycm9yKTsKCQkJCQlSZXQgPSBrRXBsRXZlbnRQb3N0RXJyb3I7CgkJCQkJZ290byBFeGl0OwoJCQkJfQoJCQl9CiNlbHNlCgkJCVJldCA9IEVwbEV2ZW50dVByb2Nlc3MocEV2ZW50X3ApOwojZW5kaWYKCgkJCWJyZWFrOwoJCX0KCglkZWZhdWx0OgoJCXsKCQkJUmV0ID0ga0VwbEV2ZW50VW5rbm93blNpbms7CgkJfQoKCX0JCQkvLyBlbmQgb2Ygc3dpdGNoKHBFdmVudF9wLT5tX0V2ZW50U2luaykKCiNpZm5kZWYgRVBMX05PX0ZJRk8KICAgICAgRXhpdDoKI2VuZGlmCglyZXR1cm4gUmV0OwoKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRnVuY3Rpb246ICAgIEVwbEV2ZW50dVBvc3RFcnJvcgovLwovLyBEZXNjcmlwdGlvbjogcG9zdCBlcnJvcmV2ZW50IGZyb20gdXNlcnNwYWNlCi8vCi8vCi8vCi8vIFBhcmFtZXRlcnM6ICBFdmVudFNvdXJjZV9wICAgPSBzb3VyY2UtbW9kdWxlIG9mIHRoZSBlcnJvcmV2ZW50Ci8vICAgICAgICAgICAgICBFcGxFcnJvcl9wICAgICA9IGNvZGUgb2Ygb2NjdXJlZCBlcnJvcgovLyAgICAgICAgICAgICAgdWlBcmdTaXplX3AgICAgID0gc2l6ZSBvZiB0aGUgYXJndW1lbnQKLy8gICAgICAgICAgICAgIHBBcmdfcCAgICAgICAgICA9IHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50Ci8vCi8vCi8vIFJldHVybnM6ICAgICAgdEVwS2VybmVsICA9IGVycm9yY29kZQovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdEVwbEtlcm5lbCBQVUJMSUMgRXBsRXZlbnR1UG9zdEVycm9yKHRFcGxFdmVudFNvdXJjZSBFdmVudFNvdXJjZV9wLAoJCQkJICAgICB0RXBsS2VybmVsIEVwbEVycm9yX3AsCgkJCQkgICAgIHVuc2lnbmVkIGludCB1aUFyZ1NpemVfcCwgdm9pZCAqcEFyZ19wKQp7Cgl0RXBsS2VybmVsIFJldDsKCUJZVEUgYWJCdWZmZXJbRVBMX01BWF9FVkVOVF9BUkdfU0laRV07Cgl0RXBsRXZlbnRFcnJvciAqcEV2ZW50RXJyb3IgPSAodEVwbEV2ZW50RXJyb3IgKikgYWJCdWZmZXI7Cgl0RXBsRXZlbnQgRXBsRXZlbnQ7CgoJUmV0ID0ga0VwbFN1Y2Nlc3NmdWw7CgoJLy8gY3JlYXRlIGFyZ3VtZW50CglwRXZlbnRFcnJvci0+bV9FdmVudFNvdXJjZSA9IEV2ZW50U291cmNlX3A7CglwRXZlbnRFcnJvci0+bV9FcGxFcnJvciA9IEVwbEVycm9yX3A7CglFUExfTUVNQ1BZKCZwRXZlbnRFcnJvci0+bV9BcmcsIHBBcmdfcCwgdWlBcmdTaXplX3ApOwoKCS8vIGNyZWF0ZSBldmVudAoJRXBsRXZlbnQubV9FdmVudFR5cGUgPSBrRXBsRXZlbnRUeXBlRXJyb3I7CglFcGxFdmVudC5tX0V2ZW50U2luayA9IGtFcGxFdmVudFNpbmtBcGk7CglFUExfTUVNU0VUKCZFcGxFdmVudC5tX05ldFRpbWUsIDB4MDAsIHNpemVvZihFcGxFdmVudC5tX05ldFRpbWUpKTsKCUVwbEV2ZW50Lm1fdWlTaXplID0KCSAgICAoc2l6ZW9mKEV2ZW50U291cmNlX3ApICsgc2l6ZW9mKEVwbEVycm9yX3ApICsgdWlBcmdTaXplX3ApOwoJRXBsRXZlbnQubV9wQXJnID0gJmFiQnVmZmVyWzBdOwoKCS8vIHBvc3QgZXJyb3JldmVudAoJUmV0ID0gRXBsRXZlbnR1UG9zdCgmRXBsRXZlbnQpOwoKCXJldHVybiBSZXQ7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgIFAgUiBJIFYgQSBUIEUgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLwovLyBGdW5jdGlvbjogICAgRXBsRXZlbnR1UnhTaWduYWxIYW5kbGVyQ2IoKQovLwovLyBEZXNjcmlwdGlvbjogQ2FsbGJhY2stZnVuY3Rpb24gZm9yIGV2ZXRzIGZyb20ga2VybmVsc3BhY2UKLy8KLy8KLy8KLy8gUGFyYW1ldGVyczogIHBTaGJSeEluc3RhbmNlX3AgICAgPSBJbnN0YW5jZS1wb2ludGVyIGZvciBidWZmZXIKLy8gICAgICAgICAgICAgIHVsRGF0YVNpemVfcCAgICAgICAgPSBzaXplIG9mIGRhdGEKLy8KLy8KLy8gUmV0dXJuczogdm9pZAovLwovLwovLyBTdGF0ZToKLy8KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2lmbmRlZiBFUExfTk9fRklGTwpzdGF0aWMgdm9pZCBFcGxFdmVudHVSeFNpZ25hbEhhbmRsZXJDYih0U2hiSW5zdGFuY2UgcFNoYlJ4SW5zdGFuY2VfcCwKCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVsRGF0YVNpemVfcCkKewoJdEVwbEV2ZW50ICpwRXBsRXZlbnQ7Cgl0U2hiRXJyb3IgU2hiRXJyb3I7Ci8vdW5zaWduZWQgbG9uZyAgIHVsQmxvY2tDb3VudDsKLy91bnNpZ25lZCBsb25nICAgdWxEYXRhU2l6ZTsKCUJZVEUgYWJEYXRhQnVmZmVyW3NpemVvZih0RXBsRXZlbnQpICsgRVBMX01BWF9FVkVOVF9BUkdfU0laRV07CgkvLyBkLmsuOiBhYkRhdGFCdWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIHRFcGxFdmVudCBzdHJ1Y3R1cmUKCS8vICAgICAgIGFuZCBiZWhpbmQgdGhpcyB0aGUgYXJndW1lbnQKCglUR1RfREJHX1NJR05BTF9UUkFDRV9QT0lOVCgyMSk7CgovLyBkLmsuIG5vdCBuZWVkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IGRvbmUgaW4gU2hhcmVkQnVmZgovKiAgICBkbwogICAgewogICAgICAgIEJFTkNITUFSS19NT0RfMjhfU0VUKDEpOyAgICAvLyA0ILVzIHVudGlsIHJlc2V0CiAgICAgICAgLy8gZ2V0IG1lc3NhZ2VzaXplCiAgICAgICAgU2hiRXJyb3IgPSBTaGJDaXJHZXRSZWFkRGF0YVNpemUgKHBTaGJSeEluc3RhbmNlX3AsICZ1bERhdGFTaXplKTsKICAgICAgICBpZihTaGJFcnJvciAhPSBrU2hiT2spCiAgICAgICAgewogICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgIH0KCiAgICAgICAgQkVOQ0hNQVJLX01PRF8yOF9SRVNFVCgxKTsgIC8vIDE0ILVzIHVudGlsIHNldAoqLwoJLy8gY29weSBkYXRhIGZyb20gZXZlbnQgcXVldWUKCVNoYkVycm9yID0gU2hiQ2lyUmVhZERhdGFCbG9jayhwU2hiUnhJbnN0YW5jZV9wLAoJCQkJICAgICAgICZhYkRhdGFCdWZmZXJbMF0sCgkJCQkgICAgICAgc2l6ZW9mKGFiRGF0YUJ1ZmZlciksICZ1bERhdGFTaXplX3ApOwoJaWYgKFNoYkVycm9yICE9IGtTaGJPaykgewoJCS8vIGVycm9yIGdvdG8gZXhpdAoJCWdvdG8gRXhpdDsKCX0KCS8vIHJlc29sdmUgdGhlIHBvaW50ZXIgdG8gdGhlIGV2ZW50IHN0cnVjdHVyZQoJcEVwbEV2ZW50ID0gKHRFcGxFdmVudCAqKSBhYkRhdGFCdWZmZXI7CgkvLyBzZXQgRGF0YXNpemUKCXBFcGxFdmVudC0+bV91aVNpemUgPSAodWxEYXRhU2l6ZV9wIC0gc2l6ZW9mKHRFcGxFdmVudCkpOwoJaWYgKHBFcGxFdmVudC0+bV91aVNpemUgPiAwKSB7CgkJLy8gc2V0IHBvaW50ZXIgdG8gYXJndW1lbnQKCQlwRXBsRXZlbnQtPm1fcEFyZyA9ICZhYkRhdGFCdWZmZXJbc2l6ZW9mKHRFcGxFdmVudCldOwoJfSBlbHNlIHsKCQkvL3NldCBwb2ludGVyIHRvIE5VTEwKCQlwRXBsRXZlbnQtPm1fcEFyZyA9IE5VTEw7Cgl9CgoJQkVOQ0hNQVJLX01PRF8yOF9TRVQoMSk7CgkvLyBjYWxsIHByb2Nlc3NmdW5jdGlvbgoJRXBsRXZlbnR1UHJvY2VzcyhwRXBsRXZlbnQpOwoKCUJFTkNITUFSS19NT0RfMjhfUkVTRVQoMSk7CgkvLyByZWFkIG51bWJlciBvZiBsZWZ0IG1lc3NhZ2VzIHRvIHByb2Nlc3MKLy8gZC5rLiBub3QgbmVlZGVkIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBkb25lIGluIFNoYXJlZEJ1ZmYKLyogICAgICAgIFNoYkVycm9yID0gU2hiQ2lyR2V0UmVhZEJsb2NrQ291bnQgKHBTaGJSeEluc3RhbmNlX3AsICZ1bEJsb2NrQ291bnQpOwogICAgICAgIGlmIChTaGJFcnJvciAhPSBrU2hiT2spCiAgICAgICAgewogICAgICAgICAgICAvLyBlcnJvciBnb3RvIGV4aXQKICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgIH0KICAgIH0gd2hpbGUgKHVsQmxvY2tDb3VudCA+IDApOwoqLwogICAgICBFeGl0OgoJcmV0dXJuOwp9CiNlbmRpZgoKLy8gRU9GCg==