LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqLwoKLyoJQXQgdGhlIG1vbWVudCwgdGhlc2UgYXJlIG9ubHkgZW1wdHkgc3R1YnMuCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkRXT1JEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7Ci8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLwojaWYgI0xBTkcoRW4pCglyZXR1cm4gOTsKI2VsaWYgI0xBTkcoRGUpCglyZXR1cm4gNzsKI2VsaWYgI0xBTkcoRXMpCglyZXR1cm4gNzsgLyogSnVzdCBhIEd1ZXNzIDotKSAqLwojZWxpZiAjTEFORyhGcikKCXJldHVybiA3OyAvKiBkaXR0byA6LSkgKi8KI2VsaWYgI0xBTkcoTm8pCglyZXR1cm4gMHgxNDsKI2Vsc2UKCS8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KCXJldHVybiAwOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkRXT1JEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgKE9MRTJOTFMuMykKICovCldPUkQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIChXT1JEKUdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KV09SRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvQSAgICAgICAgICAgICAoT0xFMk5MUy41KQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KaW50IFdJTkFQSSBHZXRMb2NhbGVJbmZvQShEV09SRCBsY2lkLERXT1JEIExDVHlwZSxMUFNUUiBidWYsV09SRCBsZW4pCnsKCWNoYXIgKnJldFN0cmluZzsKICAgIGludCByZXRMZW47CiAgICBkcHJpbnRmX29sZShzdGRkZWIsIkdldExvY2FsZUluZm9BKCU4bFgsJThsWCwlcCwlNFgpXG4iLAoJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKCS8qIFdpbmUgaXMgc3VwcG9ydGluZyBvbmx5IHRoZSBkZWZhdWx0IGxvY2FsZSAqLwoJaWYobGNpZCE9R2V0VXNlckRlZmF1bHRMQ0lEKCkpCgl7CgkJZHByaW50Zl9vbGUoc3RkbmltcCwiR2V0TG9jYWxlSW5mb0E6IFVua25vd24gbG9jYWxlXG4iKTsKCQlyZXR1cm4gMDsKCX0KCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CglyZXRMZW49MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KI2RlZmluZSBMT0NWQUwodHlwZSx2YWx1ZSkJaWYodHlwZT09TENUeXBlKQkJCVwKCQkJCQkJCQl7cmV0TGVuPXN0cmxlbih2YWx1ZSkrMTtcCgkJCQkJCQkJIHJldFN0cmluZz12YWx1ZTsgICAgICAgXAoJCQkJCQkJCX0KI2RlZmluZSBVTlNVUFBPUlRFRCh0eXBlKSAgIGlmKHR5cGU9PWxjaWQpcmV0U3RyaW5nPSN0eXBlOwoKLyogSSByZWFsbHkgd2lzaCBJIHdvdWxkIGtub3cgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgKi8KVU5TVVBQT1JURUQoTE9DQUxFX0lMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NFTkdMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lDT1VOVFJZKQpVTlNVUFBPUlRFRChMT0NBTEVfU0NPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9TRU5HQ09VTlRSWSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVENPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9TTElTVCkKVU5TVVBQT1JURUQoTE9DQUxFX0lNRUFTVVJFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RFQ0lNQUwpClVOU1VQUE9SVEVEKExPQ0FMRV9TVEhPVVNBTkQpClVOU1VQUE9SVEVEKExPQ0FMRV9TR1JPVVBJTkcpClVOU1VQUE9SVEVEKExPQ0FMRV9JRElHSVRTKQpVTlNVUFBPUlRFRChMT0NBTEVfSUxaRVJPKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR05VTUJFUikKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9TQ1VSUkVOQ1kpClVOU1VQUE9SVEVEKExPQ0FMRV9TSU5UTFNZTUJPTCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTkdST1VQSU5HKQpVTlNVUFBPUlRFRChMT0NBTEVfSUNVUlJESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ1VSUkVOQ1kpClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHQ1VSUikKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU1RJTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9TU0hPUlREQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0xPTkdEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU1RJTUVGT1JNQVQpClVOU1VQUE9SVEVEKExPQ0FMRV9JREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX0lMREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX0lUSU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfSVRJTUVNQVJLUE9TTikKVU5TVVBQT1JURUQoTE9DQUxFX0lDRU5UVVJZKQpVTlNVUFBPUlRFRChMT0NBTEVfSVRMWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX0lEQVlMWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX0lNT05MWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX1MxMTU5KQpVTlNVUFBPUlRFRChMT0NBTEVfUzIzNTkpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpVTlNVUFBPUlRFRChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpClVOU1VQUE9SVEVEKExPQ0FMRV9JRklSU1REQVlPRldFRUspClVOU1VQUE9SVEVEKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FOCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU5KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEwKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTExKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEyKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzKQpVTlNVUFBPUlRFRChMT0NBTEVfU1BPU0lUSVZFU0lHTikKVU5TVVBQT1JURUQoTE9DQUxFX1NORUdBVElWRVNJR04pClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU0lHTlBPU04pClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHU0lHTlBPU04pClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoKLyogTm93LCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXkgZG9uJ3QgaGF2ZSB0byBiZQogICBjb21wbGV0ZSAqLwojaWYgI0xBTkcoRGUpCi8qIFRoaXMgZGVmaW5pdGlvbnMgYXBwbHkgdG8gR2VybWFueSBvbmx5LiBVc2VycyBpbiBBdXN0cmlhIAogICBvciBTd2l0emVybGFuZCBtaWdodCB3YW50IHRvIG1vZGlmeSB0aGVtICovCkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRldXRzY2giKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRldSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJEZXV0c2NoIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEZXV0c2NobGFuZCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRlIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikKLyogRHVubm8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQoqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiRE0iKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKTE9DVkFMKExPQ0FMRV9TMTE1OSkKTE9DVkFMKExPQ0FMRV9TMjM1OSkKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTW9udGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIkRpZW5zdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1pdHR3b2NoIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkRvbm5lcnN0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlaXRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb25uYWJlbmQiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiU29ubnRhZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJEaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJNaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJEbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJTbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYnJ1YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJN5HJ6IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSnVsaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlemVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk3kciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRleiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQovKgpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCiovCiNlbmRpZiAvKiBMQU5HKERlKSAqLwoKI2lmICNMQU5HKERhKQovKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpICovCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJEYW5zayIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJEYW5pc2giKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGFuIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkRhbnNrIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDUiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEYW5tYXJrIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRGVubWFyayIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJEYSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEYW5tYXJrIikKLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikgKi8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ1IikKLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwia3IiKQovKiBMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKSAqLwpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCIsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsIi4iKQovKiBMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykgKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qIExPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQvTU0teXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCi8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwovKiBMT0NWQUwoTE9DQUxFX1MxMTU5KSAqLwovKiBMT0NWQUwoTE9DQUxFX1MyMzU5KSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpICovCi8qIExPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpICovCi8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpICovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJNYW5kYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiVGlyc2RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJPbnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwiVG9yc2RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJGcmVkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiTPhyZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIlP4bmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJUaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJPbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJUbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJM+CIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJT+CIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYnJ1YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJNYXJ0cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsIkFwcmlsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwiTWFqIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiSnVuaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIkp1bGkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCJBdWd1c3QiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJTZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2t0b2JlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEZWNlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJKYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJKdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJKdWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2t0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEZWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpICovCi8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKSAqLwojZW5kaWYgLyogTEFORyhEYSkgKi8KCi8qSW5zZXJ0IG90aGVyIGxhbmd1YWdlcyBoZXJlKi8KCgoKCWlmKCFyZXRMZW4pCgl7CgkJaWYoIXJldFN0cmluZylmcHJpbnRmKHN0ZGVyciwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJZWxzZSBmcHJpbnRmKHN0ZGVyciwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlLlxuIiwKCQkJcmV0U3RyaW5nKTsKCQlyZXR1cm4gMDsKCX0KCglpZihyZXRMZW4+bGVuKXJldExlbj1sZW47CglzdHJuY3B5KGJ1ZixyZXRTdHJpbmcsbGVuKTsKCXJldHVybiByZXRMZW47Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmdBICAgICAgIChPTEUyTkxTLjgpCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlLCBhbmQgdHJ1c3RzIGluIGxpYmMKICovCmludCBDb21wYXJlU3RyaW5nQShEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCgljaGFyICpzMSwgaW50IGwxLCBjaGFyICpzMixpbnQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJewoJCWZwcmludGYoc3RkbmltcCwgIkNvbXBhcmVTdHJpbmdBOiBJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJfQoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJZnByaW50ZihzdGRuaW1wLCAiQ29tcGFyZVN0cmluZ0E6IElHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KCQlzdHJuY2FzZWNtcChzMSxzMixsZW4pCToKCQlzdHJuY21wKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MClyZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMilyZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCg==