LyoKICogU2V0dXBBUEkgc3R1YnMKICoKICogQ29weXJpZ2h0IDIwMDAgSmFtZXMgSGF0aGV3YXkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAic2V0dXBhcGkuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHNldHVwYXBpKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVFBXcml0ZVByb2ZpbGVTdHJpbmcgKFNFVFVQWC42MikKICovCkJPT0wgV0lOQVBJIFRQV3JpdGVQcm9maWxlU3RyaW5nMTYoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBzdHJpbmcgKQp7CiAgICBGSVhNRSggIiVzICVzICVzOiBzdHViXG4iLCBkZWJ1Z3N0cl9hKHNlY3Rpb24pLCBkZWJ1Z3N0cl9hKGVudHJ5KSwgZGVidWdzdHJfYShzdHJpbmcpICk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJc3VFcnJvclRvSWRzICAoU0VUVVBYLjYxKQogKi8KRFdPUkQgV0lOQVBJIHN1RXJyb3JUb0lkczE2KCBXT1JEIHcxLCBXT1JEIHcyICkKewogICAgRklYTUUoICIleCAleDogc3R1YlxuIiwgdzEsIHcyICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpT3BlbkNsYXNzUmVnS2V5RXhXICAoU0VUVVBBUEkuQCkKICoKICogV0lOQVBJIGluIGRlc2NyaXB0aW9uIG5vdCBnaXZlbgogKi8KSEtFWSBXSU5BUEkgU2V0dXBEaU9wZW5DbGFzc1JlZ0tleUV4Vyhjb25zdCBHVUlEKiBjbGFzcywgUkVHU0FNIGFjY2VzcywgRFdPUkQgZmxhZ3MsIFBDV1NUUiBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpR2V0Q2xhc3NEZXNjcmlwdGlvbkV4VyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpR2V0Q2xhc3NEZXNjcmlwdGlvbkV4VyAoY29uc3QgR1VJRCogY2xhc3MsIFBXU1RSIGRlc2MsIERXT1JEIHNpemUsIFBEV09SRCByZXF1aXJlZCwgUENXU1RSIG1hY2hpbmUsIFBWT0lEIHJlc2VydmVkKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDbGFzc05hbWVGcm9tR3VpZEV4VyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpQ2xhc3NOYW1lRnJvbUd1aWRFeFcgKGNvbnN0IEdVSUQqIGNsYXNzLCBQV1NUUiBkZXNjLCBEV09SRCBzaXplLCBQRFdPUkQgcmVxdWlyZWQsIFBDV1NUUiBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpQnVpbGRDbGFzc0luZm9MaXN0RXhXICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlCdWlsZENsYXNzSW5mb0xpc3RFeFcoRFdPUkQgZmxhZ3MsIExQR1VJRCBsaXN0LCBEV09SRCBzaXplLCBQRFdPUkQgcmVxdWlyZWQsICBMUENXU1RSICBtYWNoaW5lLCBQVk9JRCByZXNlcnZlZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpR2V0RGV2aWNlSW5mb0xpc3REZXRhaWxBICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwRGlHZXREZXZpY2VJbmZvTGlzdERldGFpbEEoSERFVklORk8gZGV2aW5mbywgUFNQX0RFVklORk9fTElTVF9ERVRBSUxfREFUQV9BIGRldmluZm9fZGF0YSApCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBEaUdldERldmljZUluZm9MaXN0RGV0YWlsVyAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cERpR2V0RGV2aWNlSW5mb0xpc3REZXRhaWxXKEhERVZJTkZPIGRldmluZm8sIFBTUF9ERVZJTkZPX0xJU1RfREVUQUlMX0RBVEFfVyBkZXZpbmZvX2RhdGEgKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDcmVhdGVEZXZpY2VJbmZvTGlzdEEgKFNFVFVQQVBJLkApCiAqLwpIREVWSU5GTyBXSU5BUEkgU2V0dXBEaUNyZWF0ZURldmljZUluZm9MaXN0KGNvbnN0IEdVSUQgKmNsYXNzLCBIV05EIHBhcmVuZCkKewogIEZJWE1FKCJcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cERpQ3JlYXRlRGV2aWNlSW5mb0xpc3RFeFcgIChTRVRVUEFQSS5AKQogKi8KSERFVklORk8gV0lOQVBJIFNldHVwRGlDcmVhdGVEZXZpY2VJbmZvTGlzdEV4Vyhjb25zdCBHVUlEICpjbGFzcywgSFdORCBwYXJlbmQgLCBQQ1dTVFIgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJICAoU0VUVVBBUEkuQCkKICoKICogTk8gV0lOQVBJIGluIGRlc2NyaXB0aW9uIGdpdmVuCiAqLwpIREVWSU5GTyBXSU5BUEkgU2V0dXBEaUdldENsYXNzRGV2c0V4QShjb25zdCBHVUlEICpjbGFzcywgUENTVFIgZmlsdGVyLCBIV05EIHBhcmVudCwgRFdPUkQgZmxhZ3MsIEhERVZJTkZPIGRldmljZXNldCwgUENTVFIgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiZmlsdGVyICVzIG1hY2hpbmUgJXNcbiIsZGVidWdzdHJfYShmaWx0ZXIpLGRlYnVnc3RyX2EobWFjaGluZSkpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkgIChTRVRVUEFQSS5AKQogKgogKiBOTyBXSU5BUEkgaW4gZGVzY3JpcHRpb24gZ2l2ZW4KICovCkhERVZJTkZPIFdJTkFQSSBTZXR1cERpR2V0Q2xhc3NEZXZzRXhXKGNvbnN0IEdVSUQgKmNsYXNzLCBQQ1dTVFIgZmlsdGVyLCBIV05EIHBhcmVudCwgRFdPUkQgZmxhZ3MsIEhERVZJTkZPIGRldmljZXNldCwgUENXU1RSIG1hY2hpbmUsIFBWT0lEIHJlc2VydmVkKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldHVwRGlDbGFzc0d1aWRzRnJvbU5hbWVFeFcgIChTRVRVUEFQSS5AKQogKi8KQk9PTCBXSU5BUEkgU2V0dXBEaUNsYXNzR3VpZHNGcm9tTmFtZUV4VyhMUENXU1RSIGNsYXNzLCBMUEdVSUQgbGlzdCwgRFdPUkQgc2l6ZSwgUERXT1JEIHJlcXVpcmVkLCAgTFBDV1NUUiAgbWFjaGluZSwgUFZPSUQgcmVzZXJ2ZWQpCnsKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ01fQ29ubmVjdF9NYWNoaW5lVyAgKFNFVFVQQVBJLkApCiAqLwpEV09SRCBXSU5BUEkgQ01fQ29ubmVjdF9NYWNoaW5lVyhMUENXU1RSIG5hbWUsIHZvaWQgKiBtYWNoaW5lKQp7CiNkZWZpbmUgIENSX1NVQ0NFU1MgICAgICAgMHgwMDAwMDAwMAojZGVmaW5lICBDUl9BQ0NFU1NfREVOSUVEIDB4MDAwMDAwMzMKICBGSVhNRSgiXG4iKTsKICByZXR1cm4gIENSX0FDQ0VTU19ERU5JRUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ01fRGlzY29ubmVjdF9NYWNoaW5lICAoU0VUVVBBUEkuQCkKICovCkRXT1JEIFdJTkFQSSBDTV9EaXNjb25uZWN0X01hY2hpbmUoRFdPUkQgaGFuZGxlKQp7CiAgRklYTUUoIlxuIik7CiAgcmV0dXJuICBDUl9TVUNDRVNTOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXR1cENvcHlPRU1JbmZBICAoU0VUVVBBUEkuQCkKICovCkJPT0wgV0lOQVBJIFNldHVwQ29weU9FTUluZkEoUENTVFIgc291cmNlaW5mZmlsZSwgUENTVFIgc291cmNlbWVkaWFsb2MsCgkJCSAgICBEV09SRCBtZWRpYXR5cGUsIERXT1JEIGNvcHlzdHlsZSwgUFNUUiBkZXN0aW5mbmFtZSwKCQkJICAgIERXT1JEIGRlc3RuYW1lc2l6ZSwgUERXT1JEIHJlcXVpcmVkLAoJCQkgICAgUFNUUiAqZGVzdGluZm5hbWVjb21wb25lbnQpCnsKICBGSVhNRSgic3R1Yjogc291cmNlICVzIGxvY2F0aW9uICVzoC4uLlxuIixzb3VyY2VpbmZmaWxlLCBzb3VyY2VtZWRpYWxvYyk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUluc3RhbGxIaW5mU2VjdGlvbiAgKFNFVFVQQVBJLkApCiAqLwp2b2lkIFdJTkFQSSBJbnN0YWxsSGluZlNlY3Rpb24oSFdORCBod25kLCBISU5TVEFOQ0UgaGFuZGxlLCBMUENTVFIgY21kbGluZSwgSU5UIHNob3cpCnsKICAgIEZJWE1FKCJzdHViLCBod25kICVwLCBoYW5kbGUgJXAsIGNtZGxpbmUgJXNcbiIsIGh3bmQsIGhhbmRsZSwgZGVidWdzdHJfYShjbWRsaW5lKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0dXBHZXRJbmZJbmZvcm1hdGlvbkEgICAgKFNFVFVQQVBJLkApCiAqLwpCT09MIFdJTkFQSSBTZXR1cEdldEluZkluZm9ybWF0aW9uQSggTFBDVk9JRCBJbmZTcGVjLCBEV09SRCBTZWFyY2hDb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNQX0lORl9JTkZPUk1BVElPTiBSZXR1cm5CdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBSZXR1cm5CdWZmZXJTaXplLCBQRFdPUkQgUmVxdWlyZWRTaXplKQp7CiAgICBGSVhNRSgiKCVwLCAlbGQsICVwLCAlbGQsICVwKSBTdHViIVxuIiwKICAgICAgICAgIEluZlNwZWMsIFNlYXJjaENvbnRyb2wsIFJldHVybkJ1ZmZlciwgUmV0dXJuQnVmZmVyU2l6ZSwgUmVxdWlyZWRTaXplICk7CiAgICByZXR1cm4gVFJVRTsKfQo=