LyoqCiAqIEBmaWxlIEl4T3NhbC5oCiAqCiAqIEBicmllZiBUb3AgaW5jbHVkZSBmaWxlIGZvciBPU0FMIAogKiAKICogCiAqIEBwYXIKICogSVhQNDAwIFNXIFJlbGVhc2UgdmVyc2lvbiAyLjAKICogCiAqIC0tIENvcHlyaWdodCBOb3RpY2UgLS0KICogCiAqIEBwYXIKICogQ29weXJpZ2h0IDIwMDEtMjAwNSwgSW50ZWwgQ29ycG9yYXRpb24uCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBAcGFyCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBAcGFyCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogCiAqIEBwYXIKICogLS0gRW5kIG9mIENvcHlyaWdodCBOb3RpY2UgLS0KICovCgojaWZuZGVmIEl4T3NhbF9ICiNkZWZpbmUgSXhPc2FsX0gKCi8qIEJhc2ljIHR5cGVzICovCiNpbmNsdWRlICJJeE9zYWxUeXBlcy5oIgoKLyogSW5jbHVkZSBhc3NlcnQgKi8KI2luY2x1ZGUgIkl4T3NhbEFzc2VydC5oIgoKLyogCiAqIENvbmZpZyBoZWFkZXIgZ2l2ZXMgdXNlcnMgb3B0aW9uIHRvIGNob29zZSBJTyBNRU0gCiAqIGFuZCBidWZmZXIgbWFuYWdlbWVudCBtb2R1bGVzIAogKi8KCiNpbmNsdWRlICJJeE9zYWxDb25maWcuaCIKCi8qCiAqIFN5bWJvbCBmaWxlIG5lZWRlZCBieSBzb21lIE9TLgogKi8KI2luY2x1ZGUgIkl4T3NhbFV0aWxpdHlTeW1ib2xzLmgiCgovKiBPUy1zcGVjaWZpYyBoZWFkZXIgKi8KI2luY2x1ZGUgIkl4T3NhbE9zLmgiCgoKLyoqCiAqIEBkZWZncm91cCBJeE9zYWwgT3BlcmF0aW5nIFN5c3RlbSBBYnN0cmFjdGlvbiBMYXllciAoSXhPc2FsKSBBUEkKICoKICogQGJyaWVmIFRoaXMgc2VydmljZSBwcm92aWRlcyBhIHRoaW4gbGF5ZXIgb2YgT1MgZGVwZW5kZW5jeSBzZXJ2aWNlcy4gCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIHRvIHRoZSBmdW5jdGlvbnMgd2hpY2ggYXJlIHNvbWUgd2hhdCBPUyBkZXBlbmRhbnQgYW5kIHdvdWxkCiAqIHJlcXVpcmUgcG9ydGluZyB0byBhIHBhcnRpY3VsYXIgT1MuIAogKiBBIHByaW1hcnkgZm9jdXMgb2YgdGhlIGNvbXBvbmVudCBkZXZlbG9wbWVudCBpcyB0byBtYWtlIHRoZW0gYXMgT1MgaW5kZXBlbmRlbnQgYXMgcG9zc2libGUuCiAqIEFsbCBvdGhlciBjb21wb25lbnRzIHNob3VsZCBhYnN0cmFjdCB0aGVpciBPUyBkZXBlbmRlbmN5IHRvIHRoaXMgbW9kdWxlLgogKiBTZXJ2aWNlcyBvdmVydmlldwogKgktIyBEYXRhIHR5cGVzLCBjb25zdGFudHMsIGRlZmluZXMKICoJLSMgSW50ZXJydXB0cwogKiAgICAgICAgICAgICAgLSBiaW5kIGludGVycnVwdHMgdG8gaGFuZGxlcnMKICogICAgICAgICAgICAgIC0gdW5iaW5kIGludGVycnVwdHMgZnJvbSBoYW5kbGVycwogKiAgICAgICAgICAgICAJLSBkaXNhYmxlcyBhbGwgaW50ZXJydXB0cyAKICogICAgICAgICAgICAgIC0gZW5hYmxlcyBhbGwgaW50ZXJydXB0cyAKICogICAgICAgICAgICAgIC0gc2VsZWN0aXZlbHkgZGlzYWJsZXMgaW50ZXJydXB0cyAKICogICAgICAgICAgICAgIC0gZW5hYmxlcyBhbiBpbnRlcnJ1cHQgbGV2ZWwgCiAqICAgICAgICAgICAgICAtIGRpc2FibGVzIGFuIGludGVycnVwdCBsZXZlbCAKICogICAgICAtIyBNZW1vcnkKICogICAgICAgICAgICAgIC0gYWxsb2NhdGVzIG1lbW9yeQogKiAgICAgICAgICAgICAgLSBmcmVlcyBtZW1vcnkgCiAqICAgICAgICAgICAgICAtIGNvcGllcyBtZW1vcnkgem9uZXMgCiAqICAgICAgICAgICAgICAtIGZpbGxzIGEgbWVtb3J5IHpvbmUgCiAqICAgICAgICAgICAgICAtIGFsbG9jYXRlcyBjYWNoZS1zYWZlIG1lbW9yeSAKICogICAgICAgICAgICAgIC0gZnJlZXMgY2FjaGUtc2FmZSBtZW1vcnkgCiAqICAgICAgICAgICAgICAtIHBoeXNpY2FsIHRvIHZpcnR1YWwgYWRkcmVzcyB0cmFuc2xhdGlvbiAKICogICAgICAgICAgICAgIC0gdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzIHRyYW5zbGF0aW9uIAogKiAgICAgICAgICAgICAgLSBjYWNoZSB0byBtZW1vcnkgZmx1c2ggCiAqICAgICAgICAgICAgICAtIGNhY2hlIGxpbmUgaW52YWxpZGF0ZSAKICogICAgICAtIyBUaHJlYWRzCiAqICAgICAgICAgICAgICAtIGNyZWF0ZXMgYSBuZXcgdGhyZWFkIAogKiAgICAgICAgICAgICAgLSBzdGFydHMgYSBuZXdseSBjcmVhdGVkIHRocmVhZCAKICogICAgICAgICAgICAgIC0ga2lsbHMgYW4gZXhpc3RpbmcgdGhyZWFkIAogKiAgICAgICAgICAgICAgLSBleGl0cyBhIHJ1bm5pbmcgdGhyZWFkIAogKiAgICAgICAgICAgICAgLSBzZXRzIHRoZSBwcmlvcml0eSBvZiBhbiBleGlzdGluZyB0aHJlYWQgCiAqICAgICAgICAgICAgICAtIHN1c3BlbmRzIHRocmVhZCBleGVjdXRpb24gCiAqICAgICAgICAgICAgICAtIHJlc3VtZXMgdGhyZWFkIGV4ZWN1dGlvbiAKICogICAgICAtIyBJUEMKICogICAgICAgICAgICAgIC0gY3JlYXRlcyBhIG1lc3NhZ2UgcXVldWUgCiAqICAgICAgICAgICAgICAtIGRlbGV0ZXMgYSBtZXNzYWdlIHF1ZXVlIAogKiAgICAgICAgICAgICAgLSBzZW5kcyBhIG1lc3NhZ2UgdG8gYSBtZXNzYWdlIHF1ZXVlIAogKiAgICAgICAgICAgICAgLSByZWNlaXZlcyBhIG1lc3NhZ2UgZnJvbSBhIG1lc3NhZ2UgcXVldWUKICogICAgICAtIyBUaHJlYWQgU3luY2hyb25pc2F0aW9uCiAqICAgICAgICAgICAgICAtIGluaXRpYWxpemVzIGEgbXV0ZXggCiAqICAgICAgICAgICAgICAtIGxvY2tzIGEgbXV0ZXggCiAqICAgICAgICAgICAgICAtIHVubG9ja3MgYSBtdXRleCAKICogICAgICAgICAgICAgIC0gbm9uLWJsb2NraW5nIGF0dGVtcHQgdG8gbG9jayBhIG11dGV4IAogKiAgICAgICAgICAgICAgLSBkZXN0cm95cyBhIG11dGV4IG9iamVjdCAKICogICAgICAgICAgICAgIC0gaW5pdGlhbGl6ZXMgYSBmYXN0IG11dGV4IAogKiAgICAgICAgICAgICAgLSBub24tYmxvY2tpbmcgYXR0ZW1wdCB0byBsb2NrIGEgZmFzdCBtdXRleCAKICogICAgICAgICAgICAgIC0gdW5sb2NrcyBhIGZhc3QgbXV0ZXggCiAqICAgICAgICAgICAgICAtIGRlc3Ryb3lzIGEgZmFzdCBtdXRleCBvYmplY3QgCiAqICAgICAgICAgICAgICAtIGluaXRpYWxpemVzIGEgc2VtYXBob3JlIAogKiAgICAgICAgICAgICAgLSBwb3N0cyB0byAoaW5jcmVtZW50cykgYSBzZW1hcGhvcmUgCiAqICAgICAgICAgICAgICAtIHdhaXRzIG9uIChkZWNyZW1lbnRzKSBhIHNlbWFwaG9yZSAKICogICAgICAgICAgICAgIC0gbm9uLWJsb2NraW5nIHdhaXQgb24gc2VtYXBob3JlIAogKiAgICAgICAgICAgICAgLSBnZXRzIHNlbWFwaG9yZSB2YWx1ZSAKICogICAgICAgICAgICAgIC0gZGVzdHJveXMgYSBzZW1hcGhvcmUgb2JqZWN0IAogKiAgICAgICAgICAgICAgLSB5aWVsZHMgZXhlY3V0aW9uIG9mIGN1cnJlbnQgdGhyZWFkIAogKiAgICAgIC0jIFRpbWUgZnVuY3Rpb25zCiAqICAgICAgICAgICAgICAtIHlpZWxkaW5nIHNsZWVwIGZvciBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgCiAqICAgICAgICAgICAgICAtIGJ1c3kgc2xlZXAgZm9yIGEgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyAKICogICAgICAgICAgICAgIC0gdmFsdWUgb2YgdGhlIHRpbWVzdGFtcCBjb3VudGVyIAogKiAgICAgICAgICAgICAgLSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lc3RhbXAgY291bnRlciAKICogICAgICAgICAgICAgIC0gc3lzdGVtIGNsb2NrIHJhdGUsIGluIHRpY2tzIAogKiAgICAgICAgICAgICAgLSBjdXJyZW50IHN5c3RlbSB0aW1lIAogKiAgICAgICAgICAgICAgLSBjb252ZXJ0cyBpeE9zYWxUaW1lVmFsIGludG8gdGlja3MgCiAqICAgICAgICAgICAgICAtIGNvbnZlcnRzIHRpY2tzIGludG8gaXhPc2FsVGltZVZhbCAKICogICAgICAgICAgICAgIC0gY29udmVydHMgaXhPc2FsVGltZVZhbCB0byBtaWxsaXNlY29uZHMgCiAqICAgICAgICAgICAgICAtIGNvbnZlcnRzIG1pbGxpc2Vjb25kcyB0byBJeE9zYWxUaW1ldmFsIAogKiAgICAgICAgICAgICAgLSAiZXF1YWwiIGNvbXBhcmlzb24gZm9yIEl4T3NhbFRpbWV2YWwgCiAqICAgICAgICAgICAgICAtICJsZXNzIHRoYW4iIGNvbXBhcmlzb24gZm9yIEl4T3NhbFRpbWV2YWwgCiAqICAgICAgICAgICAgICAtICJncmVhdGVyIHRoYW4iIGNvbXBhcmlzb24gZm9yIEl4T3NhbFRpbWV2YWwgCiAqICAgICAgICAgICAgICAtICJhZGQiIG9wZXJhdG9yIGZvciBJeE9zYWxUaW1ldmFsIAogKiAgICAgICAgICAgICAgLSAic3VidHJhY3QiIG9wZXJhdG9yIGZvciBJeE9zYWxUaW1ldmFsIAogKiAgICAgIC0jIExvZ2dpbmcKICogICAgICAgICAgICAgIC0gc2V0cyB0aGUgY3VycmVudCBsb2dnaW5nIHZlcmJvc2l0eSBsZXZlbCAKICogICAgICAgICAgICAgIC0gaW50ZXJydXB0LXNhZmUgbG9nZ2luZyBmdW5jdGlvbiAKICogICAgICAtIyBUaW1lciBzZXJ2aWNlcwogKiAgICAgICAgICAgICAgLSBzY2hlZHVsZXMgYSByZXBlYXRpbmcgdGltZXIgCiAqICAgICAgICAgICAgICAtIHNjaGVkdWxlcyBhIHNpbmdsZS1zaG90IHRpbWVyIAogKiAgICAgICAgICAgICAgLSBjYW5jZWxzIGEgcnVubmluZyB0aW1lciAKICogICAgICAgICAgICAgIC0gZGlzcGxheXMgYWxsIHRoZSBydW5uaW5nIHRpbWVycyAKICogICAgICAtIyBPcHRpb25hbCBNb2R1bGVzCiAqICAgICAgICAgICAgICAtIEJ1ZmZlciBtYW5hZ2VtZW50IG1vZHVsZQogKiAgICAgICAgICAgICAgLSBJL08gbWVtb3J5IGFuZCBlbmRpYW5lc3Mgc3VwcG9ydCBtb2R1bGUKICoKICogQHsKICovCgoKLyoKICogUHJvdG90eXBlcwogKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09ICBJbnRlcnJ1cHRzICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAKICovCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgQmluZHMgYW4gaW50ZXJydXB0IGhhbmRsZXIgdG8gYW4gaW50ZXJydXB0IGxldmVsCiAqCiAqIEBwYXJhbSBpcnFMZXZlbCAoaW4pICAgLSBpbnRlcnJ1cHQgbGV2ZWwKICogQHBhcmFtIGlycUhhbmRsZXIgKGluKSAtIGludGVycnVwdCBoYW5kbGVyCiAqIEBwYXJhbSBwYXJhbWV0ZXIgKGluKSAgLSBjdXN0b20gcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCB0byB0aGUKICogICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBoYW5kbGVyCiAqCiAqIEJpbmRzIGFuIGludGVycnVwdCBoYW5kbGVyIHRvIGFuIGludGVycnVwdCBsZXZlbC4gVGhlIG9wZXJhdGlvbiB3aWxsCiAqIGZhaWwgaWYgdGhlIHdyb25nIGxldmVsIGlzIHNlbGVjdGVkLCBpZiB0aGUgaGFuZGxlciBpcyBOVUxMLCBvciBpZiB0aGUKICogaW50ZXJydXB0IGlzIGFscmVhZHkgYm91bmQuIFRoaXMgZnVuY3Rpb25zIGJpbmRzIHRoZSBzcGVjaWZpZWQgQwogKiByb3V0aW5lIHRvIGFuIGludGVycnVwdCBsZXZlbC4gV2hlbiBjYWxsZWQsIHRoZSAicGFyYW1ldGVyIiB2YWx1ZSB3aWxsCiAqIGJlIHBhc3NlZCB0byB0aGUgcm91dGluZS4KICoKICogUmVlbnRyYW50OiBubwogKiBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gSVhfU1VDQ0VTUyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBJWF9GQUlMIG90aGVyd2lzZQogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxJcnFCaW5kIChVSU5UMzIgaXJxTGV2ZWwsCgkJCQlJeE9zYWxWb2lkRm5Wb2lkUHRyIGlycUhhbmRsZXIsCgkJCQl2b2lkICpwYXJhbWV0ZXIpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIFVuYmluZHMgYW4gaW50ZXJydXB0IGhhbmRsZXIgZnJvbSBhbiBpbnRlcnJ1cHQgbGV2ZWwKICoKICogQHBhcmFtIGlycUxldmVsIChpbikgICAtIGludGVycnVwdCBsZXZlbAogKgogKiBVbmJpbmRzIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHQgbGV2ZWwgZnJvbSBhbnkgcHJldmlvdXNseSByZWdpc3RlcmVkCiAqIGhhbmRsZXIgCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gSVhfU1VDQ0VTUyBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBJWF9GQUlMIG90aGVyd2lzZQogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxJcnFVbmJpbmQgKFVJTlQzMiBpcnFMZXZlbCk7CgoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIERpc2FibGVzIGFsbCBpbnRlcnJ1cHRzCiAqCiAqIEBwYXJhbSAtIG5vbmUKICoKICogRGlzYWJsZXMgYWxsIHRoZSBpbnRlcnJ1cHRzIGFuZCBwcmV2ZW50cyB0YXNrcyBzY2hlZHVsaW5nIAogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiBpbnRlcnJ1cHQgZW5hYmxlIHN0YXR1cyBwcmlvciB0byBsb2NraW5nCiAqLwpQVUJMSUMgVUlOVDMyIGl4T3NhbElycUxvY2sgKHZvaWQpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEVuYWJsZXMgYWxsIGludGVycnVwdHMKICoKICogQHBhcmFtIGlycUVuYWJsZSAoaW4pIC0gaW50ZXJydXB0IGVuYWJsZSBzdGF0dXMsIHByaW9yIHRvIGludGVycnVwdAogKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2NraW5nIAogKgogKiBFbmFibGVzIHRoZSBpbnRlcnJ1cHRzIGFuZCB0YXNrIHNjaGVkdWxpbmcsIGNhbmNlbGxpbmcgdGhlIGVmZmVjdAogKiBvZiBpeE9zYWxJcnFMb2NrKCkgCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIElYX1NVQ0NFU1MgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQgb3IgSVhfRkFJTCBvdGhlcndpc2UKICovClBVQkxJQyB2b2lkIGl4T3NhbElycVVubG9jayAoVUlOVDMyIGlycUVuYWJsZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgU2VsZWN0aXZlbHkgZGlzYWJsZXMgaW50ZXJydXB0cwogKgogKiBAcGFyYW0gaXJxTGV2ZWwgrSBuZXcgaW50ZXJydXB0IGxldmVsCiAqCiAqIERpc2FibGVzIHRoZSBpbnRlcnJ1cHRzIGJlbG93IHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IGxldmVsIAogKiAKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEBub3RlIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gdGhpcyBmdW5jdGlvbiBjYW4gZGlzYWJsZSBhbGwKICogICAgICAgdGhlIGludGVycnVwdHMgCiAqCiAqIEByZXR1cm4gcHJldmlvdXMgaW50ZXJydXB0IGxldmVsCiAqLwpQVUJMSUMgVUlOVDMyIGl4T3NhbElycUxldmVsU2V0IChVSU5UMzIgaXJxTGV2ZWwpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEVuYWJsZXMgYW4gaW50ZXJydXB0IGxldmVsCiAqCiAqIEBwYXJhbSBpcnFMZXZlbCCtIGludGVycnVwdCBsZXZlbCB0byBlbmFibGUKICoKICogRW5hYmxlcyB0aGUgc3BlY2lmaWVkIGludGVycnVwdCBsZXZlbAogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIG5vbmUKICovClBVQkxJQyB2b2lkIGl4T3NhbElycUVuYWJsZSAoVUlOVDMyIGlycUxldmVsKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBEaXNhYmxlcyBhbiBpbnRlcnJ1cHQgbGV2ZWwKICoKICogQHBhcmFtIGlycUxldmVsIK0gaW50ZXJydXB0IGxldmVsIHRvIGRpc2FibGUKICoKICogRGlzYWJsZXMgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgbGV2ZWwKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gLSBub25lCiAqLwpQVUJMSUMgdm9pZCBpeE9zYWxJcnFEaXNhYmxlIChVSU5UMzIgaXJxTGV2ZWwpOwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICBNZW1vcnkgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAKICovCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgQWxsb2NhdGVzIG1lbW9yeQogKgogKiBAcGFyYW0gc2l6ZSAtIG1lbW9yeSBzaXplIHRvIGFsbG9jYXRlLCBpbiBieXRlcwogKgogKiBBbGxvY2F0ZXMgYSBtZW1vcnkgem9uZSBvZiBhIGdpdmVuIHNpemUKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgem9uZSBvciBOVUxMIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZAogKi8KUFVCTElDIHZvaWQgKml4T3NhbE1lbUFsbG9jIChVSU5UMzIgc2l6ZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgRnJlZXMgbWVtb3J5CiAqCiAqIEBwYXJhbSBwdHIgLSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgem9uZQogKgogKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeSB6b25lCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBub25lCiAqLwpQVUJMSUMgdm9pZCBpeE9zYWxNZW1GcmVlICh2b2lkICpwdHIpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIENvcGllcyBtZW1vcnkgem9uZXMKICoKICogQHBhcmFtIGRlc3QgIC0gZGVzdGluYXRpb24gbWVtb3J5IHpvbmUKICogQHBhcmFtIHNyYyAgIC0gc291cmNlIG1lbW9yeSB6b25lCiAqIEBwYXJhbSBjb3VudCAtIG51bWJlciBvZiBieXRlcyB0byBjb3B5CiAqCiAqIENvcGllcyBjb3VudCBieXRlcyBmcm9tIHRoZSBzb3VyY2UgbWVtb3J5IHpvbmUgcG9pbnRlZCBieSBzcmMgaW50byB0aGUKICogbWVtb3J5IHpvbmUgcG9pbnRlZCBieSBkZXN0LgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgem9uZQogKi8KUFVCTElDIHZvaWQgKml4T3NhbE1lbUNvcHkgKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgVUlOVDMyIGNvdW50KTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBGaWxscyBhIG1lbW9yeSB6b25lCiAqCiAqIEBwYXJhbSBwdHIgLSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgem9uZQogKiBAcGFyYW0gZmlsbGVyIC0gYnl0ZSB0byBmaWxsIHRoZSBtZW1vcnkgem9uZSB3aXRoCiAqIEBwYXJhbSBjb3VudCAtIG51bWJlciBvZiBieXRlcyB0byBmaWxsCiAqCiAqIEZpbGxzIGEgbWVtb3J5IHpvbmUgd2l0aCBhIGdpdmVuIGNvbnN0YW50IGJ5dGUKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgbWVtb3J5IHpvbmUKICovClBVQkxJQyB2b2lkICppeE9zYWxNZW1TZXQgKHZvaWQgKnB0ciwgVUlOVDggZmlsbGVyLCBVSU5UMzIgY291bnQpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEFsbG9jYXRlcyBjYWNoZS1zYWZlIG1lbW9yeQogKgogKiBAcGFyYW0gc2l6ZSAtIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgYWxsb2NhdGVkIHpvbmUKICoKICogQWxsb2NhdGVzIGEgY2FjaGUtc2FmZSBtZW1vcnkgem9uZSBvZiBhdCBsZWFzdCAic2l6ZSIgYnl0ZXMgYW5kIHJldHVybnMKICogdGhlIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB6b25lLiBUaGlzIG1lbW9yeSB6b25lLCBkZXBlbmRpbmcgb24gdGhlCiAqIHBsYXRmb3JtLCBpcyBlaXRoZXIgdW5jYWNoZWQgb3IgYWxpZ25lZCBvbiBhIGNhY2hlIGxpbmUgYm91bmRhcnkgdG8gbWFrZQogKiB0aGUgQ0FDSEVfRkxVU0ggYW5kIENBQ0hFX0lOVkFMSURBVEUgbWFjcm9zIHNhZmUgdG8gdXNlLiBUaGUgbWVtb3J5CiAqIGFsbG9jYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gTVVTVCBiZSBmcmVlZCB3aXRoIGl4T3NhbENhY2hlRG1hRnJlZSgpLAogKiBvdGhlcndpc2UgbWVtb3J5IGNvcnJ1cHRpb24gY2FuIG9jY3VyLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB6b25lIG9yIE5VTEwgaWYgYWxsb2NhdGlvbiBmYWlsZWQKICoKICogQG5vdGUgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBjYWNoZSBjb2hlcmVuY2UgaXMgbWFpbnRhaW5lZCBpbgogKiBzb2Z0d2FyZSBieSB1c2luZyB0aGUgSVhfT1NBTF9DQUNIRV9GTFVTSCBhbmQgSVhfT1NBTF9DQUNIRV9JTlZBTElEQVRFCiAqIG1hY3JvcyB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBiZXR3ZWVuIGNhY2hlIGFuZCBleHRlcm5hbCBtZW1vcnkuCiAqLwpQVUJMSUMgdm9pZCAqaXhPc2FsQ2FjaGVEbWFNYWxsb2MgKFVJTlQzMiBzaXplKTsKCi8qIE1hY3JvcyBmb3IgaXhPc2FsQ2FjaGVEbWFNYWxsb2MqLwojZGVmaW5lIElYX09TQUxfQ0FDSEVfRE1BX01BTExPQyhzaXplKSBpeE9zYWxDYWNoZURtYU1hbGxvYyhzaXplKQoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEZyZWVzIGNhY2hlLXNhZmUgbWVtb3J5CiAqCiAqIEBwYXJhbSBwdHIgICAtIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSB6b25lCiAqCiAqIEZyZWVzIGEgbWVtb3J5IHpvbmUgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aCBpeE9zYWxDYWNoZURtYU1hbGxvYygpCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBub25lCiAqLwpQVUJMSUMgdm9pZCBpeE9zYWxDYWNoZURtYUZyZWUgKHZvaWQgKnB0cik7CgojZGVmaW5lIElYX09TQUxfQ0FDSEVfRE1BX0ZSRUUocHRyKQkJaXhPc2FsQ2FjaGVEbWFGcmVlKHB0cikKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBwaHlzaWNhbCB0byB2aXJ0dWFsIGFkZHJlc3MgdHJhbnNsYXRpb24KICoKICogQHBhcmFtIHBoeXNBZGRyIC0gcGh5c2ljYWwgYWRkcmVzcwogKgogKiBDb252ZXJ0cyBhIHBoeXNpY2FsIGFkZHJlc3MgaW50byBpdHMgZXF1aXZhbGVudCBNTVUtbWFwcGVkIHZpcnR1YWwgYWRkcmVzcwogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiBDb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcywgYXMgVUlOVDMyCiAqLwojZGVmaW5lIElYX09TQUxfTU1VX1BIWVNfVE9fVklSVChwaHlzQWRkcikgXAogICAgSVhfT1NBTF9PU19NTVVfUEhZU19UT19WSVJUKHBoeXNBZGRyKQoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiB2aXJ0dWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MgdHJhbnNsYXRpb24KICoKICogQHBhcmFtIHZpcnRBZGRyIC0gdmlydHVhbCBhZGRyZXNzCiAqCiAqIENvbnZlcnRzIGEgdmlydHVhbCBhZGRyZXNzIGludG8gaXRzIGVxdWl2YWxlbnQgTU1VLW1hcHBlZCBwaHlzaWNhbCBhZGRyZXNzCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIENvcnJlc3BvbmRpbmcgcGh5c2ljYWwgYWRkcmVzcywgYXMgVUlOVDMyCiAqLwojZGVmaW5lIElYX09TQUxfTU1VX1ZJUlRfVE9fUEhZUyh2aXJ0QWRkcikgIFwKICAgIElYX09TQUxfT1NfTU1VX1ZJUlRfVE9fUEhZUyh2aXJ0QWRkcikKCgoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIGNhY2hlIHRvIG1lbW9yeSBmbHVzaAogKgogKiBAcGFyYW0gYWRkciAtIG1lbW9yeSBhZGRyZXNzIHRvIGZsdXNoIGZyb20gY2FjaGUKICogQHBhcmFtIHNpemUgLSBudW1iZXIgb2YgYnl0ZXMgdG8gZmx1c2ggKHJvdW5kZWQgdXAgdG8gYSBjYWNoZSBsaW5lKQogKgogKiBGbHVzaGVzIHRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlIG1lbW9yeSB6b25lIHBvaW50ZWQgYnkgImFkZHIiIGludG8gbWVtb3J5LAogKiByb3VuZGluZyB1cCB0byBhIGNhY2hlIGxpbmUuIFVzZSBiZWZvcmUgdGhlIHpvbmUgaXMgdG8gYmUgcmVhZCBieSBhCiAqIHByb2Nlc3NpbmcgdW5pdCB3aGljaCBpcyBub3QgY2FjaGUgY29oZXJlbnQgd2l0aCB0aGUgbWFpbiBDUFUuCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gbm9uZQogKi8KI2RlZmluZSBJWF9PU0FMX0NBQ0hFX0ZMVVNIKGFkZHIsIHNpemUpICBJWF9PU0FMX09TX0NBQ0hFX0ZMVVNIKGFkZHIsIHNpemUpCgoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBjYWNoZSBsaW5lIGludmFsaWRhdGUKICoKICogQHBhcmFtIGFkZHIgLSBtZW1vcnkgYWRkcmVzcyB0byBpbnZhbGlkYXRlIGluIGNhY2hlCiAqIEBwYXJhbSBzaXplIC0gbnVtYmVyIG9mIGJ5dGVzIHRvIGludmFsaWRhdGUgKHJvdW5kZWQgdXAgdG8gYSBjYWNoZSBsaW5lKQogKgogKiBJbnZhbGlkYXRlcyB0aGUgY2FjaGVkIHZhbHVlIG9mIHRoZSBtZW1vcnkgem9uZSBwb2ludGVkIGJ5ICJhZGRyIiwKICogcm91bmRpbmcgdXAgdG8gYSBjYWNoZSBsaW5lLiBVc2UgYmVmb3JlIHJlYWRpbmcgdGhlIHpvbmUgZnJvbSB0aGUgbWFpbgogKiBDUFUsIGlmIHRoZSB6b25lIGhhcyBiZWVuIHVwZGF0ZWQgYnkgYSBwcm9jZXNzaW5nIHVuaXQgd2hpY2ggaXMgbm90IGNhY2hlCiAqIGNvaGVyZW50IHdpdGggdGhlIG1haW4gQ1BVLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIG5vbmUKICovCiNkZWZpbmUgSVhfT1NBTF9DQUNIRV9JTlZBTElEQVRFKGFkZHIsIHNpemUpICBJWF9PU0FMX09TX0NBQ0hFX0lOVkFMSURBVEUoYWRkciwgc2l6ZSkKCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgVGhyZWFkcyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIAogKi8KCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBDcmVhdGVzIGEgbmV3IHRocmVhZAogKgogKiBAcGFyYW0gdGhyZWFkIC0gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdG8gYmUgY3JlYXRlZAogKiBAcGFyYW0gdGhyZWFkQXR0ciAtIHBvaW50ZXIgdG8gYSB0aHJlYWQgYXR0cmlidXRlIG9iamVjdAogKiBAcGFyYW0gc3RhcnRSb3V0aW5lIC0gdGhyZWFkIGVudHJ5IHBvaW50CiAqIEBwYXJhbSBhcmcgLSBhcmd1bWVudCBnaXZlbiB0byB0aGUgdGhyZWFkCiAqCiAqIENyZWF0ZXMgYSB0aHJlYWQgZ2l2ZW4gYSB0aHJlYWQgaGFuZGxlIGFuZCBhIHRocmVhZCBhdHRyaWJ1dGUgb2JqZWN0LiBUaGUKICogc2FtZSB0aHJlYWQgYXR0cmlidXRlIG9iamVjdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2VwYXJhdGUgdGhyZWFkcy4gIk5VTEwiCiAqIGNhbiBiZSBzcGVjaWZpZWQgYXMgdGhlIGF0dHJpYnV0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgd2lsbAogKiBiZSB1c2VkLiBUaGUgdGhyZWFkIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgc3RhcnRlZCB1c2luZyBpeE9zYWxUaHJlYWRTdGFydCgpLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFRocmVhZENyZWF0ZSAoSXhPc2FsVGhyZWFkICogdGhyZWFkLAoJCQkJICAgICBJeE9zYWxUaHJlYWRBdHRyICogdGhyZWFkQXR0ciwKCQkJCSAgICAgSXhPc2FsVm9pZEZuVm9pZFB0ciBzdGFydFJvdXRpbmUsCgkJCQkgICAgIHZvaWQgKmFyZyk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgU3RhcnRzIGEgbmV3bHkgY3JlYXRlZCB0aHJlYWQKICoKICogQHBhcmFtIHRocmVhZCAtIGhhbmRsZSBvZiB0aGUgdGhyZWFkIHRvIGJlIHN0YXJ0ZWQKICoKICogU3RhcnRzIGEgdGhyZWFkIGdpdmVuIGl0cyB0aHJlYWQgaGFuZGxlLiBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZAogKiBvbmx5IG9uY2UsIGZvbGxvd2luZyB0aGUgdGhyZWFkIGluaXRpYWxpemF0aW9uLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFRocmVhZFN0YXJ0IChJeE9zYWxUaHJlYWQgKiB0aHJlYWQpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEtpbGxzIGFuIGV4aXN0aW5nIHRocmVhZAogKgogKiBAcGFyYW0gdGhyZWFkIC0gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdG8gYmUga2lsbGVkCiAqCiAqIEtpbGxzIGEgdGhyZWFkIGdpdmVuIGl0cyB0aHJlYWQgaGFuZGxlLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAbm90ZSBJdCBpcyBub3QgcG9zc2libGUgdG8ga2lsbCB0aHJlYWRzIGluIExpbnV4IGtlcm5lbCBtb2RlLiBUaGlzIAogKiBmdW5jdGlvbiB3aWxsIG9ubHkgc2VuZCBhIFNJR1RFUk0gc2lnbmFsLCBhbmQgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CiAqIG9mIHRoZSB0aHJlYWQgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGlzIHNpZ25hbCB3aXRoCiAqIHNpZ25hbF9wZW5kaW5nKCkuCiAqCiAqIEByZXR1cm4gLSAgSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFRocmVhZEtpbGwgKEl4T3NhbFRocmVhZCAqIHRocmVhZCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgRXhpdHMgYSBydW5uaW5nIHRocmVhZAogKgogKiBUZXJtaW5hdGVzIHRoZSBjYWxsaW5nIHRocmVhZAogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zCiAqLwpQVUJMSUMgdm9pZCBpeE9zYWxUaHJlYWRFeGl0ICh2b2lkKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBTZXRzIHRoZSBwcmlvcml0eSBvZiBhbiBleGlzdGluZyB0aHJlYWQKICoKICogQHBhcmFtIHRocmVhZCAtIGhhbmRsZSBvZiB0aGUgdGhyZWFkCiAqIEBwYXJhbSBwcmlvcml0eSAtIG5ldyBwcmlvcml0eSwgYmV0d2VlbiAwIGFuZCAyNTUgKDAgYmVpbmcgdGhlIGhpZ2hlc3QpCiAqCiAqIFNldHMgdGhlIHRocmVhZCBwcmlvcml0eQogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFRocmVhZFByaW9yaXR5U2V0IChJeE9zYWxUaHJlYWQgKiB0aHJlYWQsCgkJCQkJICBVSU5UMzIgcHJpb3JpdHkpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIFN1c3BlbmRzIHRocmVhZCBleGVjdXRpb24KICoKICogQHBhcmFtIHRocmVhZCAtIGhhbmRsZSBvZiB0aGUgdGhyZWFkCiAqCiAqIFN1c3BlbmRzIHRoZSB0aHJlYWQgZXhlY3V0aW9uCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsVGhyZWFkU3VzcGVuZCAoSXhPc2FsVGhyZWFkICogdGhyZWFkKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBSZXN1bWVzIHRocmVhZCBleGVjdXRpb24KICoKICogQHBhcmFtIHRocmVhZCAtIGhhbmRsZSBvZiB0aGUgdGhyZWFkCiAqCiAqIFJlc3VtZXMgdGhlIHRocmVhZCBleGVjdXRpb24KICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxUaHJlYWRSZXN1bWUgKEl4T3NhbFRocmVhZCAqIHRocmVhZCk7CgoKLyogPT09PT09PT09PT09PT09PT09PT09PT0gIE1lc3NhZ2UgUXVldWVzIChJUEMpID09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIAogKi8KCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBDcmVhdGVzIGEgbWVzc2FnZSBxdWV1ZQogKgogKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSBoYW5kbGUKICogQHBhcmFtIG1zZ0NvdW50IC0gbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdG8gaG9sZCBpbiB0aGUgcXVldWUKICogQHBhcmFtIG1zZ0xlbiAtIG1heGltdW0gbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSwgaW4gYnl0ZXMKICoKICogQ3JlYXRlcyBhIG1lc3NhZ2UgcXVldWUgb2YgbXNnQ291bnQgbWVzc2FnZXMsIGVhY2ggY29udGFpbmluZyBtc2dMZW4gYnl0ZXMKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxNZXNzYWdlUXVldWVDcmVhdGUgKEl4T3NhbE1lc3NhZ2VRdWV1ZSAqIHF1ZXVlLAoJCQkJCSAgIFVJTlQzMiBtc2dDb3VudCwgVUlOVDMyIG1zZ0xlbik7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgRGVsZXRlcyBhIG1lc3NhZ2UgcXVldWUKICoKICogQHBhcmFtIHF1ZXVlIC0gcXVldWUgaGFuZGxlCiAqCiAqIERlbGV0ZXMgYSBtZXNzYWdlIHF1ZXVlCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsTWVzc2FnZVF1ZXVlRGVsZXRlIChJeE9zYWxNZXNzYWdlUXVldWUgKiBxdWV1ZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgU2VuZHMgYSBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQogKgogKiBAcGFyYW0gcXVldWUgLSBxdWV1ZSBoYW5kbGUKICogQHBhcmFtIG1lc3NhZ2UgLSBtZXNzYWdlIHRvIHNlbmQKICoKICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBtZXNzYWdlIHF1ZXVlLiBUaGUgbWVzc2FnZSB3aWxsIGJlIGNvcGllZCAoYXQgdGhlCiAqIGNvbmZpZ3VyZWQgc2l6ZSBvZiB0aGUgbWVzc2FnZSkgaW50byB0aGUgcXVldWUuCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxNZXNzYWdlUXVldWVTZW5kIChJeE9zYWxNZXNzYWdlUXVldWUgKiBxdWV1ZSwKCQkJCQkgVUlOVDggKiBtZXNzYWdlKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBSZWNlaXZlcyBhIG1lc3NhZ2UgZnJvbSBhIG1lc3NhZ2UgcXVldWUKICoKICogQHBhcmFtIHF1ZXVlIC0gcXVldWUgaGFuZGxlCiAqIEBwYXJhbSBtZXNzYWdlIC0gcG9pbnRlciB0byB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgY29waWVkIHRvCiAqCiAqIFJldHJpZXZlcyB0aGUgZmlyc3QgbWVzc2FnZSBmcm9tIHRoZSBtZXNzYWdlIHF1ZXVlCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxNZXNzYWdlUXVldWVSZWNlaXZlIChJeE9zYWxNZXNzYWdlUXVldWUgKiBxdWV1ZSwKCQkJCQkgICAgVUlOVDggKiBtZXNzYWdlKTsKCgovKiA9PT09PT09PT09PT09PT09PT09PT09PSAgVGhyZWFkIFN5bmNocm9uaXNhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT0KICogCiAqLwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIGluaXRpYWxpemVzIGEgbXV0ZXgKICoKICogQHBhcmFtIG11dGV4IC0gbXV0ZXggaGFuZGxlCiAqCiAqIEluaXRpYWxpemVzIGEgbXV0ZXggb2JqZWN0CiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsTXV0ZXhJbml0IChJeE9zYWxNdXRleCAqIG11dGV4KTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBsb2NrcyBhIG11dGV4CiAqCiAqIEBwYXJhbSBtdXRleCAtIG11dGV4IGhhbmRsZQogKiBAcGFyYW0gdGltZW91dCAtIHRpbWVvdXQgaW4gbXM7IElYX09TQUxfV0FJVF9GT1JFVkVSICgtMSkgdG8gd2FpdCBmb3JldmVyCiAqICAgICAgICAgICAgICAgICAgb3IgSVhfT1NBTF9XQUlUX05PTkUgdG8gcmV0dXJuIGltbWVkaWF0ZWx5CiAqCiAqIExvY2tzIGEgbXV0ZXggb2JqZWN0CiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbE11dGV4TG9jayAoSXhPc2FsTXV0ZXggKiBtdXRleCwgSU5UMzIgdGltZW91dCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgVW5sb2NrcyBhIG11dGV4CiAqCiAqIEBwYXJhbSBtdXRleCAtIG11dGV4IGhhbmRsZQogKgogKiBVbmxvY2tzIGEgbXV0ZXggb2JqZWN0CiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxNdXRleFVubG9jayAoSXhPc2FsTXV0ZXggKiBtdXRleCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgTm9uLWJsb2NraW5nIGF0dGVtcHQgdG8gbG9jayBhIG11dGV4CiAqCiAqIEBwYXJhbSBtdXRleCAtIG11dGV4IGhhbmRsZQogKgogKiBBdHRlbXB0cyB0byBsb2NrIGEgbXV0ZXggb2JqZWN0LCByZXR1cm5pbmcgaW1tZWRpYXRlbHkgd2l0aCBJWF9TVUNDRVNTIGlmCiAqIHRoZSBsb2NrIHdhcyBzdWNjZXNzZnVsIG9yIElYX0ZBSUwgaWYgdGhlIGxvY2sgZmFpbGVkCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbE11dGV4VHJ5TG9jayAoSXhPc2FsTXV0ZXggKiBtdXRleCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgRGVzdHJveXMgYSBtdXRleCBvYmplY3QKICoKICogQHBhcmFtIG11dGV4IC0gbXV0ZXggaGFuZGxlCiAqIEBwYXJhbQogKgogKiBEZXN0cm95cyBhIG11dGV4IG9iamVjdDsgdGhlIGNhbGxlciBzaG91bGQgZW5zdXJlIHRoYXQgbm8gdGhyZWFkIGlzCiAqIGJsb2NrZWQgb24gdGhpcyBtdXRleAogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbE11dGV4RGVzdHJveSAoSXhPc2FsTXV0ZXggKiBtdXRleCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgSW5pdGlhbGl6ZXMgYSBmYXN0IG11dGV4CiAqCiAqIEBwYXJhbSBtdXRleCAtIGZhc3QgbXV0ZXggaGFuZGxlCiAqCiAqIEluaXRpYWxpemVzIGEgZmFzdCBtdXRleCBvYmplY3QKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbEZhc3RNdXRleEluaXQgKEl4T3NhbEZhc3RNdXRleCAqIG11dGV4KTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBOb24tYmxvY2tpbmcgYXR0ZW1wdCB0byBsb2NrIGEgZmFzdCBtdXRleAogKgogKiBAcGFyYW0gbXV0ZXggLSBmYXN0IG11dGV4IGhhbmRsZQogKgogKiBBdHRlbXB0cyB0byBsb2NrIGEgZmFzdCBtdXRleCBvYmplY3QsIHJldHVybmluZyBpbW1lZGlhdGVseSB3aXRoCiAqIElYX1NVQ0NFU1MgaWYgdGhlIGxvY2sgd2FzIHN1Y2Nlc3NmdWwgb3IgSVhfRkFJTCBpZiB0aGUgbG9jayBmYWlsZWQKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbEZhc3RNdXRleFRyeUxvY2sgKEl4T3NhbEZhc3RNdXRleCAqIG11dGV4KTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBVbmxvY2tzIGEgZmFzdCBtdXRleAogKgogKiBAcGFyYW0gbXV0ZXggLSBmYXN0IG11dGV4IGhhbmRsZQogKgogKiBVbmxvY2tzIGEgZmFzdCBtdXRleCBvYmplY3QKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbEZhc3RNdXRleFVubG9jayAoSXhPc2FsRmFzdE11dGV4ICogbXV0ZXgpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIERlc3Ryb3lzIGEgZmFzdCBtdXRleCBvYmplY3QKICoKICogQHBhcmFtIG11dGV4IC0gZmFzdCBtdXRleCBoYW5kbGUKICoKICogRGVzdHJveXMgYSBmYXN0IG11dGV4IG9iamVjdAogKgogKiBAbGkgUmVlbnRyYW50OiB5ZXMKICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsRmFzdE11dGV4RGVzdHJveSAoSXhPc2FsRmFzdE11dGV4ICogbXV0ZXgpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIEluaXRpYWxpemVzIGEgc2VtYXBob3JlCiAqCiAqIEBwYXJhbSBzZW1hcGhvcmUgLSBzZW1hcGhvcmUgaGFuZGxlCiAqIEBwYXJhbSB2YWx1ZSAtIGluaXRpYWwgc2VtYXBob3JlIHZhbHVlCiAqCiAqIEluaXRpYWxpemVzIGEgc2VtYXBob3JlIG9iamVjdAogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFNlbWFwaG9yZUluaXQgKEl4T3NhbFNlbWFwaG9yZSAqIHNlbWFwaG9yZSwKCQkJCSAgICAgIFVJTlQzMiB2YWx1ZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgUG9zdHMgdG8gKGluY3JlbWVudHMpIGEgc2VtYXBob3JlCiAqCiAqIEBwYXJhbSBzZW1hcGhvcmUgLSBzZW1hcGhvcmUgaGFuZGxlCiAqCiAqIEluY3JlbWVudHMgYSBzZW1hcGhvcmUgb2JqZWN0CiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFNlbWFwaG9yZVBvc3QgKEl4T3NhbFNlbWFwaG9yZSAqIHNlbWFwaG9yZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgV2FpdHMgb24gKGRlY3JlbWVudHMpIGEgc2VtYXBob3JlCiAqCiAqIEBwYXJhbSBzZW1hcGhvcmUgLSBzZW1hcGhvcmUgaGFuZGxlCiAqIEBwYXJhbSB0aW1lb3V0IC0gdGltZW91dCwgaW4gbXM7IElYX09TQUxfV0FJVF9GT1JFVkVSICgtMSkgaWYgdGhlIHRocmVhZAogKiBpcyB0byBibG9jayBpbmRlZmluaXRlbHkgb3IgSVhfT1NBTF9XQUlUX05PTkUgKDApIGlmIHRoZSB0aHJlYWQgaXMgdG8KICogcmV0dXJuIGltbWVkaWF0ZWx5IGV2ZW4gaWYgdGhlIGNhbGwgZmFpbHMKICoKICogRGVjcmVtZW50cyBhIHNlbWFwaG9yZSwgYmxvY2tpbmcgaWYgdGhlIHNlbWFwaG9yZSBpcwogKiB1bmF2YWlsYWJsZSAodmFsdWUgaXMgMCkuCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsU2VtYXBob3JlV2FpdCAoSXhPc2FsU2VtYXBob3JlICogc2VtYXBob3JlLAoJCQkJICAgICAgSU5UMzIgdGltZW91dCk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgTm9uLWJsb2NraW5nIHdhaXQgb24gc2VtYXBob3JlCiAqCiAqIEBwYXJhbSBzZW1hcGhvcmUgLSBzZW1hcGhvcmUgaGFuZGxlCiAqCiAqIERlY3JlbWVudHMgYSBzZW1hcGhvcmUsIG5vdCBibG9ja2luZyB0aGUgY2FsbGluZyB0aHJlYWQgaWYgdGhlIHNlbWFwaG9yZQogKiBpcyB1bmF2YWlsYWJsZQogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFNlbWFwaG9yZVRyeVdhaXQgKEl4T3NhbFNlbWFwaG9yZSAqIHNlbWFwaG9yZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgR2V0cyBzZW1hcGhvcmUgdmFsdWUKICoKICogQHBhcmFtIHNlbWFwaG9yZSAtIHNlbWFwaG9yZSBoYW5kbGUKICogQHBhcmFtIHZhbHVlIC0gbG9jYXRpb24gdG8gc3RvcmUgdGhlIHNlbWFwaG9yZSB2YWx1ZQogKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBzZW1hcGhvcmUgb2JqZWN0CiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBJWF9TVUNDRVNTL0lYX0ZBSUwKICovClBVQkxJQyBJWF9TVEFUVVMgaXhPc2FsU2VtYXBob3JlR2V0VmFsdWUgKEl4T3NhbFNlbWFwaG9yZSAqIHNlbWFwaG9yZSwKCQkJCQkgIFVJTlQzMiAqIHZhbHVlKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBEZXN0cm95cyBhIHNlbWFwaG9yZSBvYmplY3QKICoKICogQHBhcmFtIHNlbWFwaG9yZSAtIHNlbWFwaG9yZSBoYW5kbGUKICoKICogRGVzdHJveXMgYSBzZW1hcGhvcmUgb2JqZWN0OyB0aGUgY2FsbGVyIHNob3VsZCBlbnN1cmUgdGhhdCBubyB0aHJlYWQgaXMKICogYmxvY2tlZCBvbiB0aGlzIHNlbWFwaG9yZQogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbFNlbWFwaG9yZURlc3Ryb3kgKEl4T3NhbFNlbWFwaG9yZSAqIHNlbWFwaG9yZSk7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgWWllbGRzIGV4ZWN1dGlvbiBvZiBjdXJyZW50IHRocmVhZAogKgogKiBZaWVsZHMgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIG5vbmUKICovClBVQkxJQyB2b2lkIGl4T3NhbFlpZWxkICh2b2lkKTsKCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBUaW1lIGZ1bmN0aW9ucyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIAogKi8KCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBZaWVsZGluZyBzbGVlcCBmb3IgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCiAqCiAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwCiAqCiAqIFRoZSBjYWxsaW5nIHRocmVhZCB3aWxsIHNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCiAqIFRoaXMgc2xlZXAgaXMgeWllbGRpbmcsIGhlbmNlIG90aGVyIHRhc2tzIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZQogKiBvcGVyYXRpbmcgc3lzdGVtIGR1cmluZyB0aGUgc2xlZXAgcGVyaW9kLiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBhbgogKiBhcmd1bWVudCBvZiAwIHdpbGwgcGxhY2UgdGhlIHRocmVhZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjaGVkdWxpbmcKICogbG9vcC4KICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIG5vbmUKICovClBVQkxJQyB2b2lkIGl4T3NhbFNsZWVwIChVSU5UMzIgbWlsbGlzZWNvbmRzKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBCdXN5IHNsZWVwIGZvciBhIG51bWJlciBvZiBtaWNyb3NlY29uZHMKICoKICogQHBhcmFtIG1pY3Jvc2Vjb25kcyAtIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gc2xlZXAKICoKICogU2xlZXBzIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWNyb3NlY29uZHMsIHdpdGhvdXQgZXhwbGljaXRseQogKiB5aWVsZGluZyB0aHJlYWQgZXhlY3V0aW9uIHRvIHRoZSBPUyBzY2hlZHVsZXIKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gbm9uZQogKi8KUFVCTElDIHZvaWQgaXhPc2FsQnVzeVNsZWVwIChVSU5UMzIgbWljcm9zZWNvbmRzKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBYWFgKICoKICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHRpbWVzdGFtcAogKgogKiBAbGkgUmVlbnRyYW50OiB5ZXMKICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gLSBUaGUgY3VycmVudCB0aW1lc3RhbXAKICoKICogQG5vdGUgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgcGxhdGZvcm0tc3BlY2lmaWMuIE5vdAogKiBhbGwgdGhlIHBsYXRmb3JtcyBwcm92aWRlIGEgaGlnaC1yZXNvbHV0aW9uIHRpbWVzdGFtcCBjb3VudGVyLgogKi8KUFVCTElDIFVJTlQzMiBpeE9zYWxUaW1lc3RhbXBHZXQgKHZvaWQpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIFJlc29sdXRpb24gb2YgdGhlIHRpbWVzdGFtcCBjb3VudGVyCiAqCiAqIFJldHJpZXZlcyB0aGUgcmVzb2x1dGlvbiAoZnJlcXVlbmN5KSBvZiB0aGUgdGltZXN0YW1wIGNvdW50ZXIuCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIFRoZSByZXNvbHV0aW9uIG9mIHRoZSB0aW1lc3RhbXAgY291bnRlcgogKgogKiBAbm90ZSBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBpcyBwbGF0Zm9ybS1zcGVjaWZpYy4gTm90IGFsbAogKiB0aGUgcGxhdGZvcm1zIHByb3ZpZGUgYSBoaWdoLXJlc29sdXRpb24gdGltZXN0YW1wIGNvdW50ZXIuCiAqLwpQVUJMSUMgVUlOVDMyIGl4T3NhbFRpbWVzdGFtcFJlc29sdXRpb25HZXQgKHZvaWQpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIFN5c3RlbSBjbG9jayByYXRlLCBpbiB0aWNrcwogKgogKiBSZXRyaWV2ZXMgdGhlIHJlc29sdXRpb24gKG51bWJlciBvZiB0aWNrcyBwZXIgc2Vjb25kKSBvZiB0aGUgc3lzdGVtIGNsb2NrCiAqCiAqIEBsaSBSZWVudHJhbnQ6IG5vCiAqIEBsaSBJUlEgc2FmZTogIG5vCiAqCiAqIEByZXR1cm4gLSBUaGUgc3lzdGVtIGNsb2NrIHJhdGUKICoKICogQG5vdGUgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgcGxhdGZvcm0gYW5kIE9TLXNwZWNpZmljLgogKiBUaGUgc3lzdGVtIGNsb2NrIHJhdGUgaXMgbm90IGFsd2F5cyBhdmFpbGFibGUgLSBlLmcuIExpbnV4IGRvZXMgbm90CiAqIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB1c2VyIG1vZGUKICovClBVQkxJQyBVSU5UMzIgaXhPc2FsU3lzQ2xvY2tSYXRlR2V0ICh2b2lkKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBDdXJyZW50IHN5c3RlbSB0aW1lCiAqCiAqIEBwYXJhbSB0diAtIHBvaW50ZXIgdG8gYW4gSXhPc2FsVGltZXZhbCBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGN1cnJlbnQKICogICAgICAgICAgICAgdGltZSBpbgogKgogKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgKHJlYWwtdGltZSkKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIG5vbmUKICoKICogQG5vdGUgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgcGxhdGZvcm0tc3BlY2lmaWMuIE5vdCBhbGwKICogcGxhdGZvcm1zIGhhdmUgYSByZWFsLXRpbWUgY2xvY2suCiAqLwpQVUJMSUMgdm9pZCBpeE9zYWxUaW1lR2V0IChJeE9zYWxUaW1ldmFsICogdHYpOwoKCgovKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjb252ZXJ0IHRpbWVyIHZhbCB0byB0aWNrcy4KICogTk9URSAtIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgdGhlIHVzZXIuCiAqIFVzZSB0aGUgbWFjcm8gSVhfT1NBTF9USU1FVkFMX1RPX1RJQ0tTIAogKiBPUy1pbmRlcGVuZGVudCwgaW1wbGVtZW50ZWQgaW4gZnJhbWV3b3JrLgogKi8KUFVCTElDIFVJTlQzMiBpeE9zYWxUaW1ldmFsVG9UaWNrcyAoSXhPc2FsVGltZXZhbCB0dik7CgoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIENvbnZlcnRzIGl4T3NhbFRpbWVWYWwgaW50byB0aWNrcwogKgogKiBAcGFyYW0gdHYgLSBhbiBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZQogKgogKiBDb252ZXJ0cyBhbiBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZSBpbnRvIE9TIHRpY2tzCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIENvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHRpY2tzCiAqIAogKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIE9TLWluZGVwZW5kZW50LiBJbXBsZW1lbnRlZCBieSBjb3JlLgogKi8KI2RlZmluZSBJWF9PU0FMX1RJTUVWQUxfVE9fVElDS1ModHYpICBpeE9zYWxUaW1ldmFsVG9UaWNrcyh0dikKCgoKLyogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY29udmVydCB0aWNrcyB0byB0aW1lciB2YWwKICogTk9URSAtIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgdGhlIHVzZXIuCiAqIFVzZSB0aGUgbWFjcm8gSVhfT1NBTF9USUNLU19UT19USU1FVkFMIAogKi8KClBVQkxJQyB2b2lkIGl4T3NhbFRpY2tzVG9UaW1ldmFsIChVSU5UMzIgdGlja3MsIEl4T3NhbFRpbWV2YWwgKiBwVHYpOwoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBDb252ZXJ0cyB0aWNrcyBpbnRvIGl4T3NhbFRpbWVWYWwgCiAqCiAqIEBwYXJhbSB0aWNrcyAtIG51bWJlciBvZiB0aWNrcwogKiBAcGFyYW0gcFR2IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gc3RydWN0dXJlCiAqCiAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpY2tzIGludG8gYW4gSXhPc2FsVGltZXZhbCBzdHJ1Y3R1cmUKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gQ29ycmVzcG9uZGluZyBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZQogKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIE9TLWluZGVwZW5kZW50LiBJbXBsZW1lbnRlZCBieSBjb3JlLgogKi8KI2RlZmluZSBJWF9PU0FMX1RJQ0tTX1RPX1RJTUVWQUwodGlja3MsIHBUdikgIFwKICAgIGl4T3NhbFRpY2tzVG9UaW1ldmFsKHRpY2tzLCBwVHYpCgoKCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgQ29udmVydHMgaXhPc2FsVGltZVZhbCB0byBtaWxsaXNlY29uZHMKICoKICogQHBhcmFtIHR2IC0gSXhPc2FsVGltZXZhbCBzdHJ1Y3R1cmUgdG8gY29udmVydAogKgogKiBDb252ZXJ0cyBhbiBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZSBpbnRvIG1pbGxpc2Vjb25kcwogKgogKiBAbGkgUmVlbnRyYW50OiB5ZXMKICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gLSBDb3JyZXNwb25kaW5nIG51bWJlciBvZiBtaWxsaXNlY29uZHMKICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBPUy1pbmRlcGVuZGVudC4gSW1wbGVtZW50ZWQgYnkgY29yZS4KICovCiNkZWZpbmUgSVhfT1NBTF9USU1FVkFMX1RPX01TKHR2KSAgICAgKCh0di5zZWNzICogMTAwMCkgKyAodHYubnNlY3MgLyAxMDAwMDAwKSkKCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgQ29udmVydHMgbWlsbGlzZWNvbmRzIHRvIEl4T3NhbFRpbWV2YWwKICoKICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gY29udmVydAogKiBAcGFyYW0gcFR2IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gc3RydWN0dXJlCiAqCiAqIENvbnZlcnRzIGEgbWlsbGlzZWNvbmQgdmFsdWUgaW50byBhbiBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZQogKgogKiBAbGkgUmVlbnRyYW50OiB5ZXMKICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIEByZXR1cm4gLSBDb3JyZXNwb25kaW5nIEl4T3NhbFRpbWV2YWwgc3RydWN0dXJlCiAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgT1MtaW5kZXBlbmRlbnQuIEltcGxlbWVudGVkIGJ5IGNvcmUuCiAqLwojZGVmaW5lIElYX09TQUxfTVNfVE9fVElNRVZBTChtaWxsaXNlY29uZHMsIHBUdikgIFwKICAgCSAgICAoKEl4T3NhbFRpbWV2YWwgKikgcFR2KS0+c2VjcyA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7CQkJICBcCiAgICAgICAgKChJeE9zYWxUaW1ldmFsICopIHBUdiktPm5zZWNzID0gKG1pbGxpc2Vjb25kcyAlIDEwMDApICogMTAwMDAwMAoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiAiZXF1YWwiIGNvbXBhcmlzb24gZm9yIEl4T3NhbFRpbWV2YWwKICoKICogQHBhcmFtIHR2QSwgdHZCIC0gSXhPc2FsVGltZXZhbCBzdHJ1Y3R1cmVzIHRvIGNvbXBhcmUKICoKICogQ29tcGFyZXMgdHdvIEl4T3NhbFRpbWV2YWwgc3RydWN0dXJlcyBmb3IgZXF1YWxpdHkKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gVFJVRSBpZiB0aGUgc3RydWN0dXJlcyBhcmUgZXF1YWwKICogICAgICAgICAtIEZBTFNFIG90aGVyd2lzZQogKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIE9TLWluZGVwZW5kYW50CiAqLwojZGVmaW5lIElYX09TQUxfVElNRV9FUSh0dkEsIHR2QikgICAgICAgIFwKICAgICAgICAoKHR2QSkuc2VjcyA9PSAodHZCKS5zZWNzICYmICh0dkEpLm5zZWNzID09ICh0dkIpLm5zZWNzKQoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiAibGVzcyB0aGFuIiBjb21wYXJpc29uIGZvciBJeE9zYWxUaW1ldmFsCiAqCiAqIEBwYXJhbSB0dkEsIHR2QiAtIEl4T3NhbFRpbWV2YWwgc3RydWN0dXJlcyB0byBjb21wYXJlCiAqCiAqIENvbXBhcmVzIHR3byBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvbmUgaXMKICogbGVzcyB0aGFuIHRoZSBzZWNvbmQgb25lCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIFRSVUUgaWYgdHZBIDwgdHZCCiAqICAgICAgICAgLSBGQUxTRSBvdGhlcndpc2UKICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBPUy1pbmRlcGVuZGVudC4gSW1wbGVtZW50ZWQgYnkgY29yZS4KICovCiNkZWZpbmUgSVhfT1NBTF9USU1FX0xUKHR2QSx0dkIpIFwKICAgICAgICAoKHR2QSkuc2VjcyAgPCAodHZCKS5zZWNzIHx8CVwKICAgICAgICAoKHR2QSkuc2VjcyA9PSAodHZCKS5zZWNzICYmICh0dkEpLm5zZWNzIDwgKHR2QikubnNlY3MpKQoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiAiZ3JlYXRlciB0aGFuIiBjb21wYXJpc29uIGZvciBJeE9zYWxUaW1ldmFsCiAqCiAqIEBwYXJhbSB0dkEsIHR2QiAtIEl4T3NhbFRpbWV2YWwgc3RydWN0dXJlcyB0byBjb21wYXJlCiAqCiAqIENvbXBhcmVzIHR3byBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBmaXJzdCBvbmUgaXMKICogZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQgb25lCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIFRSVUUgaWYgdHZBID4gdHZCCiAqICAgICAgICAgLSBGQUxTRSAgb3RoZXJ3aXNlCiAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgT1MtaW5kZXBlbmRlbnQuCiAqLwojZGVmaW5lIElYX09TQUxfVElNRV9HVCh0dkEsIHR2QikgIFwKICAgICAgICAoKHR2QSkuc2VjcyAgPiAodHZCKS5zZWNzIHx8CVwKICAgICAgICAoKHR2QSkuc2VjcyA9PSAodHZCKS5zZWNzICYmICh0dkEpLm5zZWNzID4gKHR2QikubnNlY3MpKQoKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiAiYWRkIiBvcGVyYXRvciBmb3IgSXhPc2FsVGltZXZhbAogKgogKiBAcGFyYW0gdHZBLCB0dkIgLSBJeE9zYWxUaW1ldmFsIHN0cnVjdHVyZXMgdG8gYWRkCiAqCiAqIEFkZHMgdGhlIHNlY29uZCBJeE9zYWxUaW1ldmFsU3RydWN0IHRvIHRoZSBmaXJzdCBvbmUgKGVxdWl2YWxlbnQgdG8KICogdHZBICs9IHR2QikKICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gbm9uZQogKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIE9TLWluZGVwZW5kZW50LgogKi8KI2RlZmluZSBJWF9PU0FMX1RJTUVfQUREKHR2QSwgdHZCKSAgXAogICAgICAgICh0dkEpLnNlY3MgKz0gKHR2Qikuc2VjczsgICBcCiAgICAgICAgKHR2QSkubnNlY3MgKz0gKHR2QikubnNlY3M7IFwKICAgICAgICBpZiAoKHR2QSkubnNlY3MgPj0gSVhfT1NBTF9CSUxMSU9OKSBcCiAgICAJeyBcCiAgICAgICAgKHR2QSkuc2VjcysrOyBcCiAgICAgICAgKHR2QSkubnNlY3MgLT0gSVhfT1NBTF9CSUxMSU9OOyB9CgoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmICJzdWJ0cmFjdCIgb3BlcmF0b3IgZm9yIEl4T3NhbFRpbWV2YWwKICoKICogQHBhcmFtIHR2QSwgdHZCIC0gSXhPc2FsVGltZXZhbCBzdHJ1Y3R1cmVzIHRvIHN1YnRyYWN0CiAqCiAqIFN1YnRyYWN0cyB0aGUgc2Vjb25kIEl4T3NhbFRpbWV2YWxTdHJ1Y3QgZnJvbSB0aGUgZmlyc3Qgb25lIChlcXVpdmFsZW50CiAqIHRvIHR2QSAtPSB0dkIpCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIG5vbmUKICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBPUy1pbmRlcGVuZGVudC4gSW1wbGVtZW50ZWQgYnkgY29yZS4KICovCiNkZWZpbmUgSVhfT1NBTF9USU1FX1NVQih0dkEsIHR2QikgICBcCiAgICAgICAgaWYgKCh0dkEpLm5zZWNzID49ICh0dkIpLm5zZWNzKSBcCiAgICAgICAgeyBcCiAgICAgICAgICAodHZBKS5zZWNzIC09ICh0dkIpLnNlY3M7IFwKICAgICAgICAgICh0dkEpLm5zZWNzIC09ICh0dkIpLm5zZWNzOyBcCiAgICAgICAgfSBcCiAgICAgICAgZWxzZSBcCiAgICAgICAgeyBcCiAgICAgICAgICAodHZBKS5zZWNzIC09ICgodHZCKS5zZWNzICsgMSk7IFwKICAgICAgICAgICh0dkEpLm5zZWNzICs9IElYX09TQUxfQklMTElPTiAtICh0dkIpLm5zZWNzOyBcCiAgICAgICAgfQoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExvZ2dpbmcgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAKICovCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgSW50ZXJydXB0LXNhZmUgbG9nZ2luZyBmdW5jdGlvbgogKgogKiBAcGFyYW0gbGV2ZWwgLSBpZGVudGlmaWVyIHByZWZpeCBmb3IgdGhlIG1lc3NhZ2UKICogQHBhcmFtIGRldmljZSAtIG91dHB1dCBkZXZpY2UKICogQHBhcmFtIGZvcm1hdCAtIG1lc3NhZ2UgZm9ybWF0LCBpbiBhIHByaW50ZiBmb3JtYXQKICogQHBhcmFtIC4uLiAtIHVwIHRvIDYgYXJndW1lbnRzIHRvIGJlIHByaW50ZWQKICoKICogSVJRLXNhZmUgbG9nZ2luZyBmdW5jdGlvbiwgc2ltaWxhciB0byBwcmludGYuIEFjY2VwdHMgdXAgdG8gNiBhcmd1bWVudHMKICogdG8gcHJpbnQgKGV4Y2x1ZGluZyB0aGUgbGV2ZWwsIGRldmljZSBhbmQgdGhlIGZvcm1hdCkuIFRoaXMgZnVuY3Rpb24gd2lsbAogKiBhY3R1YWxseSBkaXNwbGF5IHRoZSBtZXNzYWdlIG9ubHkgaWYgdGhlIGxldmVsIGlzIGxvd2VyIHRoYW4gdGhlIGN1cnJlbnQKICogdmVyYm9zaXR5IGxldmVsIG9yIGlmIHRoZSBJWF9PU0FMX0xPR19VU0VSIGxldmVsIGlzIHVzZWQuIEFuIG91dHB1dCBkZXZpY2UKICogbXVzdCBiZSBzcGVjaWZpZWQgKHNlZSBJeE9zYWxUeXBlcy5oKS4KICoKICogQGxpIFJlZW50cmFudDogeWVzCiAqIEBsaSBJUlEgc2FmZTogIHllcwogKgogKiBAcmV0dXJuIC0gQmVzaWRlIHRoZSBleGNlcHRpb25zIGRvY3VtZW50ZWQgaW4gdGhlIG5vdGUgYmVsb3csIHRoZSByZXR1cm5lZAogKiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHByaW50ZWQgY2hhcmFjdGVycywgb3IgLTEgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCiAqIGluY29ycmVjdCAoTlVMTCBmb3JtYXQsIHVua25vd24gb3V0cHV0IGRldmljZSkKICoKICogQG5vdGUgVGhlIGV4Y2VwdGlvbnMgdG8gdGhlIHJldHVybiB2YWx1ZSBhcmU6CiAqIFZ4V29ya3M6IFRoZSByZXR1cm4gdmFsdWUgaXMgMzIgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBpcyAxIGFuZCA2NAogKiBpZiB0aGUgc3BlY2lmaWVkIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBsZXNzIG9yIGVxdWFsIHRoYW4gOS4KICogV2luQ0U6IElmIGNvbXBpbGVkIGZvciBFQk9PVCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDAuCiAqCiAqIEBub3RlIFRoZSBnaXZlbiBwcmludCBmb3JtYXQgc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBzcGVjaWZpZWQgCiAqIG91dHB1dCBkZXZpY2UuIElYX09TQUxfU1RET1VUIHN1cHBvcnRzIGFsbCB0aGUgdXN1YWwgcHJpbnQgZm9ybWF0cywKICogaG93ZXZlciBhIGN1c3RvbSBoZXggZGlzcGxheSBzcGVjaWZpZWQgYnkgSVhfT1NBTF9IRVggd291bGQgc3VwcG9ydAogKiBvbmx5IGEgZml4ZWQgbnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZ2l0cy4KICovClBVQkxJQyBJTlQzMiBpeE9zYWxMb2cgKEl4T3NhbExvZ0xldmVsIGxldmVsLAoJCQlJeE9zYWxMb2dEZXZpY2UgZGV2aWNlLAoJCQljaGFyICpmb3JtYXQsCgkJCWludCBhcmcxLAoJCQlpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0LCBpbnQgYXJnNSwgaW50IGFyZzYpOwoKLyoqIAogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIHNldHMgdGhlIGN1cnJlbnQgbG9nZ2luZyB2ZXJib3NpdHkgbGV2ZWwKICoKICogQHBhcmFtIGxldmVsIC0gbmV3IGxvZyB2ZXJib3NpdHkgbGV2ZWwKICoKICogU2V0cyB0aGUgbG9nIHZlcmJvc2l0eSBsZXZlbC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgSVhfT1NBTF9MT0dfRVJST1IuCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIE9sZCBsb2cgdmVyYm9zaXR5IGxldmVsCiAqLwpQVUJMSUMgVUlOVDMyIGl4T3NhbExvZ0xldmVsU2V0IChVSU5UMzIgbGV2ZWwpOwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExvZ2dpbmcgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAKICovCgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgU2NoZWR1bGVzIGEgcmVwZWF0aW5nIHRpbWVyCiAqCiAqIEBwYXJhbSB0aW1lciAtIGhhbmRsZSBvZiB0aGUgdGltZXIgb2JqZWN0CiAqIEBwYXJhbSBwZXJpb2QgLSB0aW1lciB0cmlnZ2VyIHBlcmlvZCwgaW4gbWlsbGlzZWNvbmRzCiAqIEBwYXJhbSBwcmlvcml0eSAtIHRpbWVyIHByaW9yaXR5ICgwIGJlaW5nIHRoZSBoaWdoZXN0KQogKiBAcGFyYW0gY2FsbGJhY2sgLSB1c2VyIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSB0aW1lciB0cmlnZ2VycwogKiBAcGFyYW0gcGFyYW0gLSBjdXN0b20gcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sKICoKICogU2NoZWR1bGVzIGEgdGltZXIgdG8gYmUgY2FsbGVkIGV2ZXJ5IHBlcmlvZCBtaWxsaXNlY29uZHMuIFRoZSB0aW1lcgogKiB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9uIHBvc3NpYmx5IGluIGludGVycnVwdAogKiBjb250ZXh0LCBwYXNzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXIuIElmIHNldmVyYWwgdGltZXJzIHRyaWdnZXIgYXQgdGhlCiAqIHNhbWUgdGltZSBjb250ZW50aW9uIGlzc3VlcyBhcmUgZGVhbHQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZXIKICogcHJpb3JpdGllcy4KICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxSZXBlYXRpbmdUaW1lclNjaGVkdWxlIChJeE9zYWxUaW1lciAqIHRpbWVyLAoJCQkJCSAgICAgICBVSU5UMzIgcGVyaW9kLAoJCQkJCSAgICAgICBVSU5UMzIgcHJpb3JpdHksCgkJCQkJICAgICAgIEl4T3NhbFZvaWRGblZvaWRQdHIgY2FsbGJhY2ssCgkJCQkJICAgICAgIHZvaWQgKnBhcmFtKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBTY2hlZHVsZXMgYSBzaW5nbGUtc2hvdCB0aW1lcgogKgogKiBAcGFyYW0gdGltZXIgLSBoYW5kbGUgb2YgdGhlIHRpbWVyIG9iamVjdAogKiBAcGFyYW0gcGVyaW9kIC0gdGltZXIgdHJpZ2dlciBwZXJpb2QsIGluIG1pbGxpc2Vjb25kcwogKiBAcGFyYW0gcHJpb3JpdHkgLSB0aW1lciBwcmlvcml0eSAoMCBiZWluZyB0aGUgaGlnaGVzdCkKICogQHBhcmFtIGNhbGxiYWNrIC0gdXNlciBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgdGltZXIgdHJpZ2dlcnMKICogQHBhcmFtIHBhcmFtIC0gY3VzdG9tIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCiAqCiAqIFNjaGVkdWxlcyBhIHRpbWVyIHRvIGJlIGNhbGxlZCBhZnRlciBwZXJpb2QgbWlsbGlzZWNvbmRzLiBUaGUgdGltZXIKICogd2lsbCBjZWFzZSB0byBmdW5jdGlvbiBwYXN0IGl0cyBmaXJzdCB0cmlnZ2VyLiBUaGUgdGltZXIgd2lsbCBpbnZva2UKICogdGhlIHNwZWNpZmllZCBjYWxsYmFjayBmdW5jdGlvbiwgcG9zc2libHkgaW4gaW50ZXJydXB0IGNvbnRleHQsIHBhc3NpbmcKICogdGhlIGdpdmVuIHBhcmFtZXRlci4gSWYgc2V2ZXJhbCB0aW1lcnMgdHJpZ2dlciBhdCB0aGUgc2FtZSB0aW1lIGNvbnRlbnRpb24KICogaXNzdWVzIGFyZSBkZWFsdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lciBwcmlvcml0aWVzLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICBubwogKgogKiBAcmV0dXJuIC0gSVhfU1VDQ0VTUy9JWF9GQUlMCiAqLwpQVUJMSUMgSVhfU1RBVFVTCml4T3NhbFNpbmdsZVNob3RUaW1lclNjaGVkdWxlIChJeE9zYWxUaW1lciAqIHRpbWVyLAoJCQkgICAgICAgVUlOVDMyIHBlcmlvZCwKCQkJICAgICAgIFVJTlQzMiBwcmlvcml0eSwKCQkJICAgICAgIEl4T3NhbFZvaWRGblZvaWRQdHIgY2FsbGJhY2ssIHZvaWQgKnBhcmFtKTsKCi8qKiAKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBDYW5jZWxzIGEgcnVubmluZyB0aW1lcgogKgogKiBAcGFyYW0gdGltZXIgLSBoYW5kbGUgb2YgdGhlIHRpbWVyIG9iamVjdAogKgogKiBDYW5jZWxzIGEgc2luZ2xlLXNob3Qgb3IgcmVwZWF0aW5nIHRpbWVyLgogKgogKiBAbGkgUmVlbnRyYW50OiBubwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogQHJldHVybiAtIElYX1NVQ0NFU1MvSVhfRkFJTAogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxUaW1lckNhbmNlbCAoSXhPc2FsVGltZXIgKiB0aW1lcik7CgovKiogCiAqIEBpbmdyb3VwIEl4T3NhbAogKgogKiBAYnJpZWYgZGlzcGxheXMgYWxsIHRoZSBydW5uaW5nIHRpbWVycwogKgogKiBEaXNwbGF5cyBhIGxpc3Qgd2l0aCBhbGwgdGhlIHJ1bm5pbmcgdGltZXJzIGFuZCB0aGVpciBwYXJhbWV0ZXJzIChoYW5kbGUsCiAqIHBlcmlvZCwgdHlwZSwgcHJpb3JpdHksIGNhbGxiYWNrIGFuZCB1c2VyIHBhcmFtZXRlcikKICoKICogQGxpIFJlZW50cmFudDogbm8KICogQGxpIElSUSBzYWZlOiAgbm8KICoKICogQHJldHVybiAtIG5vbmUKICovClBVQkxJQyB2b2lkIGl4T3NhbFRpbWVyc1Nob3cgKHZvaWQpOwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZlcnNpb24gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAKICovCgovKioKICogQGluZ3JvdXAgSXhPc2FsCiAqCiAqIEBicmllZiBwcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgT3BlcmF0aW5nIFN5c3RlbSBydW5uaW5nCiAqCiAqIEBwYXJhbSBvc05hbWUgLSBQb2ludGVyIHRvIGEgTlVMTC10ZXJtaW5hdGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzCiAqIHRoYXQgaG9sZHMgdGhlIG5hbWUgb2YgdGhlIE9TIHJ1bm5pbmcuCiAqIFRoaXMgaXMgYm90aCBhbiBpbnB1dCBhbmQgYW4gb3VwdXQgcGFyYW1ldGVyCiAqIEBwYXJhbSBtYXhTaXplIC0gSW5wdXQgcGFyYW1ldGVyIHRoYXQgZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKICogYnl0ZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIG9zTmFtZQogKgogKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCBkZXNjcmliZSB0aGUgT3BlcmF0aW5nIFN5c3RlbSBuYW1lCiAqCiAqIEBsaSBSZWVudHJhbnQ6IHllcwogKiBAbGkgSVJRIHNhZmU6ICB5ZXMKICoKICogcmV0dXJuIC0gSVhfU1VDQ0VTUyBmb3Igc3VjY2Vzc2Z1bCByZXRyaWV2YWwKICogICAgICAgIC0gSVhfRkFJTCBpZiAob3NUeXBlID09IE5VTEwgfCBtYXhTaXplID08IDApCiAqLwpQVUJMSUMgSVhfU1RBVFVTIGl4T3NhbE9zTmFtZUdldCAoSU5UOCogb3NOYW1lLCBJTlQzMiBtYXhTaXplKTsKCi8qKgogKiBAaW5ncm91cCBJeE9zYWwKICoKICogQGJyaWVmIHByb3ZpZGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHJ1bm5pbmcKICoKICogQHBhcmFtIG9zVmVyc2lvbiAtIFBvaW50ZXIgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMKICogdGhhdCBob2xkcyB0aGUgdmVyc2lvbiBvZiB0aGUgT1MgcnVubmluZy4KICogVGhpcyBpcyBib3RoIGFuIGlucHV0IGFuZCBhbiBvdXB1dCBwYXJhbWV0ZXIKICogQHBhcmFtIG1heFNpemUgLSBJbnB1dCBwYXJhbWV0ZXIgdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZgogKiBieXRlcyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gb3NWZXJzaW9uCiAqCiAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGRlc2NyaWJlIHRoZSBPcGVyYXRpbmcgU3lzdGVtJ3MgdmVyc2lvbgogKgogKiBAbGkgUmVlbnRyYW50OiB5ZXMKICogQGxpIElSUSBzYWZlOiAgeWVzCiAqCiAqIHJldHVybiAtIElYX1NVQ0NFU1MgZm9yIHN1Y2Nlc3NmdWwgcmV0cmlldmFsCiAqICAgICAgICAtIElYX0ZBSUwgaWYgKG9zVmVyc2lvbiA9PSBOVUxMIHwgbWF4U2l6ZSA9PCAwKQogKi8KUFVCTElDIElYX1NUQVRVUyBpeE9zYWxPc1ZlcnNpb25HZXQoSU5UOCogb3NWZXJzaW9uLCBJTlQzMiBtYXhTaXplKTsKCgoKLyoqCiAqIEB9IEl4T3NhbAogKi8KCiNlbmRpZiAvKiBJeE9zYWxfSCAqLwo=