LyoKICogU2V0dXBBUEkgc3R1YnMKICoKICogQ29weXJpZ2h0IDIwMDAgSmFtZXMgSGF0aGV3YXkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAic2V0dXBhcGkuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHNldHVwYXBpKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVFBXcml0ZVByb2ZpbGVTdHJpbmcgKFNFVFVQWC42MikKICovCkJPT0wgV0lOQVBJIFRQV3JpdGVQcm9maWxlU3RyaW5nMTYoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBzdHJpbmcgKQp7CiAgICBGSVhNRSggIiVzICVzICVzOiBzdHViXG4iLCBkZWJ1Z3N0cl9hKHNlY3Rpb24pLCBkZWJ1Z3N0cl9hKGVudHJ5KSwgZGVidWdzdHJfYShzdHJpbmcpICk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJc3VFcnJvclRvSWRzICAoU0VUVVBYLjYxKQogKi8KRFdPUkQgV0lOQVBJIHN1RXJyb3JUb0lkczE2KCBXT1JEIHcxLCBXT1JEIHcyICkKewogICAgRklYTUUoICIleCAleDogc3R1YlxuIiwgdzEsIHcyICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpT3BlbkNsYXNzUmVnS2V5RXhXICAoU0VUVVBBUEkuQCkKICoKICogV0lOQVBJIGluIGRlc2NyaXB0aW9uIG5vdCBnaXZlbgogKi8KSEtFWSBXSU5BUEkgU2V0dXBEaU9wZW5DbGFzc1JlZ0tleUV4VyhMUEdVSUQgY2xhc3MsIERXT1JEIGFjY2VzcywgRFdPUkQgZmxhZ3MsIExQQ1dTVFIgIG1hY2hpbmUsIFBWT0lEIHJlc2VydmVkKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlHZXRDbGFzc0Rlc2NyaXB0aW9uRXhXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlHZXRDbGFzc0Rlc2NyaXB0aW9uRXhXIChHVUlEKiBjbGFzcywgTFBDV1NUUiBkZXNjLCBEV09SRCBzaXplLCBQRFdPUkQgcmVxdWlyZWQsIExQQ1dTVFIgIG1hY2hpbmUsIFBWT0lEIHJlc2VydmVkKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDbGFzc05hbWVGcm9tR3VpZEV4VyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpQ2xhc3NOYW1lRnJvbUd1aWRFeFcgKEdVSUQqIGNsYXNzLCBMUENXU1RSIGRlc2MsIERXT1JEIHNpemUsIFBEV09SRCByZXF1aXJlZCwgTFBDV1NUUiAgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUJ1aWxkQ2xhc3NJbmZvTGlzdEV4VyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpQnVpbGRDbGFzc0luZm9MaXN0RXhXKERXT1JEIGZsYWdzLCBMUEdVSUQgbGlzdCwgRFdPUkQgc2l6ZSwgUERXT1JEIHJlcXVpcmVkLCAgTFBDV1NUUiAgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUdldERldmljZUluZm9MaXN0RGV0YWlsVyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpR2V0RGV2aWNlSW5mb0xpc3REZXRhaWxBKEhERVZJTkZPIGRldmluZm8sIFBTUF9ERVZJTkZPX0RBVEEgZGV2aW5mb19kYXRhICkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpR2V0RGV2aWNlSW5mb0xpc3REZXRhaWxXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlHZXREZXZpY2VJbmZvTGlzdERldGFpbFcoSERFVklORk8gZGV2aW5mbywgUFNQX0RFVklORk9fREFUQSBkZXZpbmZvX2RhdGEgKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDcmVhdGVEZXZpY2VJbmZvTGlzdEEgKFNFVFVQQVBJLkApCiAqLwpIREVWSU5GTyBXSU5BUEkgU2V0dXBEaUNyZWF0ZURldmljZUluZm9MaXN0KExQR1VJRCBjbGFzcywgSFdORCBwYXJlbmQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUNyZWF0ZURldmljZUluZm9MaXN0RXhXICAoU0VUVVBBUEkuQCkKICovCkhERVZJTkZPIFdJTkFQSSBTZXR1cERpQ3JlYXRlRGV2aWNlSW5mb0xpc3RFeFcoTFBHVUlEIGNsYXNzLCBIV05EIHBhcmVuZCwgTFBDV1NUUiBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkgIChTRVRVUEFQSS5AKQogKgogKiBOTyBXSU5BUEkgaW4gZGVzY3JpcHRpb24gZ2l2ZW4KICovCkhERVZJTkZPIFdJTkFQSSBTZXR1cERpR2V0Q2xhc3NEZXZzRXhBKExQR1VJRCBjbGFzcywgTFBDU1RSIGZpbHRlciwgSFdORCBwYXJlbnQsIERXT1JEIGZsYWdzLCBIREVWSU5GTyBkZXZpY2VzZXQsIExQQ1NUUiBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJmaWx0ZXIgJXMgbWFjaGluZSAlc1xuIixkZWJ1Z3N0cl9hKGZpbHRlciksZGVidWdzdHJfYShtYWNoaW5lKSk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCSAgKFNFVFVQQVBJLkApCiAqCiAqIE5PIFdJTkFQSSBpbiBkZXNjcmlwdGlvbiBnaXZlbgogKi8KSERFVklORk8gV0lOQVBJIFNldHVwRGlHZXRDbGFzc0RldnNFeFcoTFBHVUlEIGNsYXNzLCBMUENXU1RSIGZpbHRlciwgSFdORCBwYXJlbnQsIERXT1JEIGZsYWdzLCBIREVWSU5GTyBkZXZpY2VzZXQsIExQQ1dTVFIgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUNsYXNzR3VpZHNGcm9tTmFtZUV4VyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpQ2xhc3NHdWlkc0Zyb21OYW1lRXhXKExQQ1dTVFIgY2xhc3MsIExQR1VJRCBsaXN0LCBEV09SRCBzaXplLCBQRFdPUkQgcmVxdWlyZWQsICBMUENXU1RSICBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDTV9Db25uZWN0X01hY2hpbmVXICAoU0VUVVBBUEkuQCkKICovCkRXT1JEIFdJTkFQSSBDTV9Db25uZWN0X01hY2hpbmVXKExQQ1dTVFIgbmFtZSwgdm9pZCAqIG1hY2hpbmUpCnsKI2RlZmluZSAgQ1JfU1VDQ0VTUyAgICAgICAweDAwMDAwMDAwCiNkZWZpbmUgIENSX0FDQ0VTU19ERU5JRUQgMHgwMDAwMDAzMwogIEZJWE1FKCJcbiIpOwogIHJldHVybiAgQ1JfQUNDRVNTX0RFTklFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDTV9EaXNjb25uZWN0X01hY2hpbmUgIChTRVRVUEFQSS5AKQogKi8KRFdPUkQgV0lOQVBJIENNX0Rpc2Nvbm5lY3RfTWFjaGluZShEV09SRCBoYW5kbGUpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gIENSX1NVQ0NFU1M7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwQ29weU9FTUluZkEgIChTRVRVUEFQSS5AKQogKi8KQk9PTCBXSU5BUEkgU2V0dXBDb3B5T0VNSW5mQShMUENTVFIgc291cmNlaW5mZmlsZSwgTFBDU1RSIHNvdXJjZW1lZGlhbG9jLAoJCQkgICAgRFdPUkQgbWVkaWF0eXBlLCBEV09SRCBjb3B5c3R5bGUsIExQU1RSIGRlc3RpbmZuYW1lLAoJCQkgICAgRFdPUkQgZGVzdG5hbWVzaXplLCBQRFdPUkQgcmVxdWlyZWQsCgkJCSAgICBMUFNUUiBkZXN0aW5mbmFtZWNvbXBvbmVudCkKewogIEZJWE1FKCJzdHViOiBzb3VyY2UgJXMgbG9jYXRpb24gJXOgLi4uXG4iLHNvdXJjZWluZmZpbGUsIHNvdXJjZW1lZGlhbG9jKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSW5zdGFsbEhpbmZTZWN0aW9uICAoU0VUVVBBUEkuQCkKICovCnZvaWQgV0lOQVBJIEluc3RhbGxIaW5mU2VjdGlvbihIV05EIGh3bmQsIEhJTlNUQU5DRSBoYW5kbGUsIExQQ1NUUiBjbWRsaW5lLCBJTlQgc2hvdykKewogICAgRklYTUUoInN0dWIsIGh3bmQgJXAsIGhhbmRsZSAlcCwgY21kbGluZSAlc1xuIiwgaHduZCwgaGFuZGxlLCBkZWJ1Z3N0cl9hKGNtZGxpbmUpKTsKfQo=