LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgImhlYXAuaCIKI2luY2x1ZGUgIm9sZS5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbEluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKCWNoYXIJKm5hbWU7CglEV09SRAlpZDsKfSBsb2NhbGVfbmFtZTJpZFtdPSB7CglMT0NBTEVfRU5UUlkoSUxBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNFTkdMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKElDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0VOR0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVExBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQU5TSUNPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShTTElTVCksCglMT0NBTEVfRU5UUlkoSU1FQVNVUkUpLAoJTE9DQUxFX0VOVFJZKFNERUNJTUFMKSwKCUxPQ0FMRV9FTlRSWShTVEhPVVNBTkQpLAoJTE9DQUxFX0VOVFJZKFNHUk9VUElORyksCglMT0NBTEVfRU5UUlkoSURJR0lUUyksCglMT0NBTEVfRU5UUlkoSUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTkVHTlVNQkVSKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShTQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKFNJTlRMU1lNQk9MKSwKCUxPQ0FMRV9FTlRSWShTTU9OREVDSU1BTFNFUCksCglMT0NBTEVfRU5UUlkoU01PTlRIT1VTQU5EU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJSU5UTENVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoSU5FR0NVUlIpLAoJTE9DQUxFX0VOVFJZKFNEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRSksCglMT0NBTEVfRU5UUlkoU1NIT1JUREFURSksCglMT0NBTEVfRU5UUlkoU0xPTkdEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRUZPUk1BVCksCglMT0NBTEVfRU5UUlkoSURBVEUpLAoJTE9DQUxFX0VOVFJZKElMREFURSksCglMT0NBTEVfRU5UUlkoSVRJTUUpLAoJTE9DQUxFX0VOVFJZKElUSU1FTUFSS1BPU04pLAoJTE9DQUxFX0VOVFJZKElDRU5UVVJZKSwKCUxPQ0FMRV9FTlRSWShJVExaRVJPKSwKCUxPQ0FMRV9FTlRSWShJREFZTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElNT05MWkVSTyksCglMT0NBTEVfRU5UUlkoUzExNTkpLAoJTE9DQUxFX0VOVFJZKFMyMzU5KSwKCUxPQ0FMRV9FTlRSWShJQ0FMRU5EQVJUWVBFKSwKCUxPQ0FMRV9FTlRSWShJT1BUSU9OQUxDQUxFTkRBUiksCglMT0NBTEVfRU5UUlkoSUZJUlNUREFZT0ZXRUVLKSwKCUxPQ0FMRV9FTlRSWShJRklSU1RXRUVLT0ZZRUFSKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNQT1NJVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKFNORUdBVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKElQT1NTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSU5FR1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElQT1NTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShJTkVHU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElORUdTRVBCWVNQQUNFKSwKLyoJTE9DQUxFX0VOVFJZKEZPTlRTSUdOQVRVUkUpLCovCgl7TlVMTCwwfSwKfTsKCmNvbnN0IHN0cnVjdCBtYXBfbGNpZDJzdHIgewoJTENJRAkJbGFuZ2lkOwoJY29uc3QgY2hhcgkqbGFuZ25hbWU7Cn0gbGFuZ3VhZ2VzW109ewoJezB4MDQwMSwiQXJhYmlzY2gifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkRkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuenZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicmRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbGRuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJSZHRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW1kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVHxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybGRuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgR2V0VXNlckRlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjEpCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7Ci8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLwogICAgc3dpdGNoKE9wdGlvbnMubGFuZ3VhZ2UpCiAgICB7CiAvKiBjYXNlIExBTkdfQnU6IHJldHVybiAweDAyOyAqLyAgICAgIC8qIEJ1bGdhcmlhbiAqLwogLyogY2FzZSBMQU5HX0NoOiByZXR1cm4gMHgwNDsgKi8gICAgICAvKiBDaGluZXNlICovCiAgICBjYXNlIExBTkdfQ3o6IHJldHVybiAweDA1OyAgICAgICAgIC8qIEN6ZWNoICovCiAgICBjYXNlIExBTkdfRGE6IHJldHVybiAweDA2OyAgICAgICAgIC8qIERhbmlzaCAqLwogICAgY2FzZSBMQU5HX0RlOiByZXR1cm4gMHgwNzsgICAgICAgICAvKiBHZXJtYW4gKi8KIC8qIGNhc2UgTEFOR19HcjogcmV0dXJuIDB4MDg7ICovICAgICAgLyogR3JlZWsgKi8KICAgIGNhc2UgTEFOR19FbjogcmV0dXJuIDB4MDk7ICAgICAgICAgLyogRW5nbGlzaCAqLwogICAgY2FzZSBMQU5HX0VzOiByZXR1cm4gMHgwYTsgICAgICAgICAvKiBTcGFuaXNoICovCiAgICBjYXNlIExBTkdfRmk6IHJldHVybiAweDBiOyAgICAgICAgIC8qIEZpbm5pc2ggKi8KICAgIGNhc2UgTEFOR19GcjogcmV0dXJuIDB4MGM7ICAgICAgICAgLyogRnJlbmNoICovCiAgICBjYXNlIExBTkdfSHU6IHJldHVybiAweDBlOyAgICAgICAgIC8qIEh1bmdhcmlhbiAqLwogLyogY2FzZSBMQU5HX0ljOiByZXR1cm4gMHgwZjsgKi8gICAgICAvKiBJY2VsYW5kaWMgKi8KICAgIGNhc2UgTEFOR19JdDogcmV0dXJuIDB4MTA7ICAgICAgICAgLyogSXRhbGlhbiAqLwogLyogY2FzZSBMQU5HX0pwOiByZXR1cm4gMHgxMTsgKi8gICAgICAvKiBKYXBhbmVzZSAqLwogICAgY2FzZSBMQU5HX0tvOiByZXR1cm4gMHgxMjsgICAgICAgICAvKiBLb3JlYW4gKi8KIC8qIGNhc2UgTEFOR19EdTogcmV0dXJuIDB4MTM7ICovICAgICAgLyogRHV0Y2ggKi8KICAgIGNhc2UgTEFOR19ObzogcmV0dXJuIDB4MTQ7ICAgICAgICAgLyogTm9yd2VnaWFuICovCiAgICBjYXNlIExBTkdfUGw6IHJldHVybiAweDE1OyAgICAgICAgIC8qIFBvbGlzaCAqLwogICAgY2FzZSBMQU5HX1BvOiByZXR1cm4gMHgxNjsgICAgICAgICAvKiBQb3J0dWd1ZXNlICovCiAvKiBjYXNlIExBTkdfUm86IHJldHVybiAweDE4OyAqLyAgICAgIC8qIFJvbWFuaWFuICovCiAvKiBjYXNlIExBTkdfUnU6IHJldHVybiAweDE5OyAqLyAgICAgIC8qIFJ1c3NpYW4gKi8KIC8qIGNhc2UgTEFOR19DcjogcmV0dXJuIDB4MWE7ICovICAgICAgLyogQ3JvYXRpYW4gKi8KIC8qIGNhc2UgTEFOR19TbDogcmV0dXJuIDB4MWI7ICovICAgICAgLyogU2xvdmFrICovCiAgICBjYXNlIExBTkdfU3c6IHJldHVybiAweDFkOyAgICAgICAgIC8qIFN3ZWRpc2ggKi8KIC8qIGNhc2UgTEFOR19UdTogcmV0dXJuIDB4MWY7ICovICAgICAgLyogVHVya2lzaCAqLwogLyogY2FzZSBMQU5HX1N2OiByZXR1cm4gMHgyNDsgKi8gICAgICAvKiBTbG92ZW5pYW4gKi8KICAgIGNhc2UgTEFOR19FbzogcmV0dXJuIDB4MjU7ICAgICAgICAgLyogRXNwZXJhbnRvIChub3Qgb2ZmaWNpYWwpICovCiAgICBjYXNlIExBTkdfQ2E6IHJldHVybiAweDI2OyAgICAgICAgIC8qIENhdGFsYW4gKi8KCiAgICBkZWZhdWx0OgoJcmV0dXJuIDB4MDA7ICAgICAgICAgICAgICAgICAgIC8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkxDSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICAoT0xFMk5MUy4zKQogKi8KTEFOR0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiAoV09SRClHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgKE9MRTJOTFMuNCkKICovCkxBTkdJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvQSAgICAgICAgICAgICAoT0xFMk5MUy41KQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMTYgV0lOQVBJIEdldExvY2FsZUluZm8xNihMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMTYgbGVuKQp7CglyZXR1cm4gR2V0TG9jYWxlSW5mbzMyQShsY2lkLExDVHlwZSxidWYsbGVuKTsKfQoKSU5UMzIgV0lOQVBJIEdldExvY2FsZUluZm8zMkEoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVDMyIGxlbikKewoJY2hhcgkqcmV0U3RyaW5nOwoJaW50CWZvdW5kLGk7CgoJVFJBQ0Uob2xlLCIoJThsWCwlOGxYLCVwLCU0WClcbiIsCgkJCWxjaWQsTENUeXBlLGJ1ZixsZW4pOwoKCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgoJLyogQXMgYW4gb3B0aW9uLCB3ZSBjb3VsZCBvYnRhaW4gdGhlIHZhbHVlIGZyb20gd2luLmluaS4KCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCgkgICBBbHNvLCBub3QgYWxsIGlkZW50aWZpZXJzIGFyZSBhdmFpbGFibGUgZnJvbSB3aW4uaW5pICovCglyZXRTdHJpbmc9MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KCWk9MDsKCXdoaWxlIChsb2NhbGVfbmFtZTJpZFtpXS5uYW1lIT1OVUxMKSB7CgkJaWYgKExDVHlwZSA9PSBsb2NhbGVfbmFtZTJpZFtpXS5pZCkgewoJCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCQlicmVhazsKCQl9CgkJaSsrOwoJfQoJaWYgKCFyZXRTdHJpbmcpIHsKCQlXQVJOKG9sZSwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKSBjYXNlIHR5cGU6cmV0U3RyaW5nPXZhbHVlO2JyZWFrOwoKLyogTm93LCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXkgZG9uJ3QgaGF2ZSB0byBiZQogICBjb21wbGV0ZSAqLwogICAgZm91bmQ9MTsKICAgIHN3aXRjaChPcHRpb25zLmxhbmd1YWdlKQogICAgewogICAgY2FzZSBMQU5HX0RlOgogICAgCXN3aXRjaCAoTENUeXBlKSB7Ci8qIFRoaXMgZGVmaW5pdGlvbnMgYXBwbHkgdG8gR2VybWFueSBvbmx5LiBVc2VycyBpbiBBdXN0cmlhIAogICBvciBTd2l0emVybGFuZCBtaWdodCB3YW50IHRvIG1vZGlmeSB0aGVtICovCkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRldXRzY2giKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRldSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJEZXV0c2NoIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEZXV0c2NobGFuZCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRlIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI4NTEiKQovKiBEdW5ubwpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQoqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiRE0iKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKTE9DVkFMKExPQ0FMRV9TMTE1OSkKTE9DVkFMKExPQ0FMRV9TMjM1OSkKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTW9udGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIkRpZW5zdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1pdHR3b2NoIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkRvbm5lcnN0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlaXRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb25uYWJlbmQiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiU29ubnRhZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJEaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJNaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJEbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJTbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYnJ1YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJN5HJ6IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSnVsaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlemVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk3kciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRleiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQovKgpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCiovCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKERlKSAqLwoKICAgIGNhc2UgTEFOR19EYToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiNiIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJEYW5zayIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJEYW5pc2giKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGFuIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkRhbnNrIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDUiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEYW5tYXJrIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRGVubWFyayIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJESyIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEYW5tYXJrIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI2IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ1IikKLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwia3IiKQovKiBMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKSAqLwpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCIsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsIi4iKQovKiBMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykgKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qIExPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQvTU0teXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCi8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwpMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikKTE9DVkFMKExPQ0FMRV9TMjM1OSwgIiIpCi8qIExPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkgKi8KLyogTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspICovCi8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikgKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk1hbmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJUaXJzZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk9uc2RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJUb3JzZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIkZyZWRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJM+HJkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiU/huZGFnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk1hIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIlRpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIk9uIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIlRvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIkZyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIkz4IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlP4IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiSmFudWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiRmVicnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk1hcnRzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSnVsaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlY2VtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk1hciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRlYyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoRGEpICovCgogICAgY2FzZSBMQU5HX0VuOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDQwOSIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCAiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIkVuZ2xpc2giKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgIkVOVSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiRW5nbGlzaCIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksICIxIikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwgIlVuaXRlZCBTdGF0ZXMiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiVVNBIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJVbml0ZWQgU3RhdGVzIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDQwOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjQzNyIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsICIxMjUyIikKTE9DVkFMKExPQ0FMRV9TTElTVCwgIiwiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsICIuIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsICIsIikKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcsICIzOzAiKQpMT0NWQUwoTE9DQUxFX0lESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sICIxIikKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSLCAiMSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUywgIjAxMjM0NTY3ODkiKQpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwgIiQiKQpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MLCAiVVNEIikKTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCwgIi4iKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwgIiwiKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORywgIjM7MCIpCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksICIwIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwgIjAiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCAiLyIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsICI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCAiTS9kL3l5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsICJkZGRkLCBNTU1NIGRkLCB5eXl5IikKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwgImg6bW06c3MgdHQiKQpMT0NWQUwoTE9DQUxFX0lEQVRFLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUxEQVRFLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSVRJTUUsICIwIikKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlksICIwIikKTE9DVkFMKExPQ0FMRV9JVExaRVJPLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPLCAiMCIpCkxPQ1ZBTChMT0NBTEVfUzExNTksICJBTSIpCkxPQ1ZBTChMT0NBTEVfUzIzNTksICJQTSIpCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSwgIjEiKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLLCAiNiIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUiwgIjAiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwgIk1vbmRheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCAiVHVlc2RheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCAiV2VkbmVzZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsICJUaHVyc2RheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCAiRnJpZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsICJTYXR1cmRheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCAiU3VuZGF5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsICJNb24iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwgIlR1ZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCAiV2VkIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsICJUaHUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwgIkZyaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCAiU2F0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsICJTdW4iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCAiSmFudWFyeSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsICJGZWJydWFyeSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsICJNYXJjaCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsICJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsICJNYXkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCAiSnVuZSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsICJKdWx5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwgIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksICJTZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwgIk9jdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwgIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsICJEZWNlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCAiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsICJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCAiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwgIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsICJNYXkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCAiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywgIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsICJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCAiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsICJPY3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwgIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCAiRGVjIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsICIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIwIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEVuKSAqLwoKICAgIGNhc2UgTEFOR19FbzoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewovKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpIElTTyBudW1lcmljYWwgSUQgZm9yIGxhbmd1YWdlIFRPRE8gKi8KTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkVzcGVyYW50byIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJFc3BlcmFudG8iKQovKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGV1IikgKi8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkVzcGVyYW50byIpCi8qIExPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5Iikgbm90IG9mZmljaWFsIGluIGFueSBvbmUgY291bnRyeSAqLwovKiBMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEZXV0c2NobGFuZCIpICovCi8qIExPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkdlcm1hbnkiKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRGUiKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRGV1dHNjaGxhbmQiKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKSBJU08gSUQgb2YgbGFuZyBUT0RPICovCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0OSIpICovCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiMyIpIC8qIGlzIHRoaXMgcmlnaHQ/IFRPRE8gKi8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiMyIpIC8qIGlzIHRoaXMgcmlnaHQ/IFRPRE8gKi8KTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQovKiBMT0NWQUwoTE9DQUxFX1NHUk9VUElORykgKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpICovCi8qIExPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykgKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIk5MRyIpIC8qIGFjY291bnRpbmcgY3VycmVuY3kgb2YgVUVBICovCi8qIExPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpICovCi8qIExPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApICovCi8qIExPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpICovCi8qIExPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwieXl5eS5tbS5kZCIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCi8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwovKiBMT0NWQUwoTE9DQUxFX1MxMTU5KSAqLwovKiBMT0NWQUwoTE9DQUxFX1MyMzU5KSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpICovCi8qIExPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpICovCi8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpICovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJsdW5kbyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJtYXJkbyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJtZXJrcmVkbyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCK8Yf1kbyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJ2ZW5kcmVkbyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJzYWJhdG8iKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiZGltYW7mbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJsdSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJtYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJtZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCK8YSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJ2ZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJzYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJkaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsImphbnVhcm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJmZWJydWFybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIm1hcnRvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiYXByaWxvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwibWFqbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsImp1bmlvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywianVsaW8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCJh/Wd1c3RvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwic2VwdGVtYnJvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIm9rdG9icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwibm92ZW1icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiZGVjZW1icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiamFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiZmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywibWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiYXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwibWFqIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwianVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywianVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiYf1nIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwic2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIm9rdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJub3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiZGVjIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qIExPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykgKi8KLyogTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkgKi8KCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRW8pICovCgogICAgY2FzZSBMQU5HX0ZpOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIxMSIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJTdW9taSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJGaW5uaXNoIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImZpbiIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJzdW9taSIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiU3VvbWkiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJGaW5sYW5kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkZpbiIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJTdW9taSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMTEiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiMzU4IikKLyogCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkKKi8KTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQovKgpMT0NWQUwoTE9DQUxFX1NHUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpCklzIHRoaXMgIjAxMjM0NTY3ODkiID8/CkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIm1rIikKLyoKTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkKTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVApCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikKLyoKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC5NTS55eXl5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKLyoKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkKKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSUxEQVRFKQoqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKQoqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pCiovCkxPQ1ZBTChMT0NBTEVfUzExNTksICJBTSIpCkxPQ1ZBTChMT0NBTEVfUzIzNTksICJQTSIpCi8qCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkKTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikKTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIm1hYW5hbnRhaSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJ0aWlzdGFpIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsImtlc2tpdmlpa2tvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsInRvcnN0YWkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwicGVyamFudGFpIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsImxhdWFudGFpIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsInN1bm51bnRhaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJUaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJLZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJUbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJQZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJMYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJTdSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsInRhbW1pa3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiaGVsbWlrdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJtYWFsaXNrdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJodWh0aWt1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsInRvdWtva3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwia2Vz5Gt1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsImhlaW7ka3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiZWxva3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwic3l5c2t1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJsb2tha3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIm1hcnJhc2t1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJqb3VsdWt1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJ0YW1taSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsImhlbG1pIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywibWFhbGlzIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiaHVodGkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJ0b3VrbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsImtlc+QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJoZWlu5CIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsImVsbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksInN5eXMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwibG9rYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJtYXJyYXMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiam91bHUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoqLwoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhGaSkgKi8KCiAgICBjYXNlIExBTkdfSXQ6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiSXRhbGlhbm8iKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiSXRhbGlhbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJpdGEiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiSXRhbGlhbm8iKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCIzOSIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIkl0YWxpYSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkl0YWx5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkl0IikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkl0YWxpYSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIzOSIpCi8qIER1bm5vCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkKKi8KTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQovKgpMT0NWQUwoTE9DQUxFX1NHUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpCklzIHRoaXMgIjAxMjM0NTY3ODkiID8/CkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIkxpdC4iKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKTE9DVkFMKExPQ0FMRV9TMTE1OSkKTE9DVkFMKExPQ0FMRV9TMjM1OSkKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTHVuZWRpJyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJNYXJ0ZWRpJyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJNZXJjb2xlZGknIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkdpb3ZlZGknIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIlZlbmVyZGknIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIlNhYmF0byIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJEb21lbmljYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJMdSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJNYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJNZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJHaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJWZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJEbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkdlbm5haW8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJicmFpbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk1hcnpvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWxlIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwiTWFnZ2lvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiR2l1Z25vIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiTHVnbGlvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQWdvc3RvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2V0dGVtYnJlIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIk90dG9icmUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1icmUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGljZW1icmUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiR2VuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiR2l1IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiTHVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQWdvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiU2V0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk90dCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGljIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKi8KCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoSXQpICovCgogICAgY2FzZSAweDA4MDk6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIwODA5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIkVuZ2xpc2giKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgIkVORyIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiRW5nbGlzaCIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksICI0NCIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksICJVbml0ZWQgS2luZ2RvbSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJVbml0ZWQgS2luZ2RvbSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiR0JSIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJVbml0ZWQgS2luZ2RvbSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA4MDkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwgIjQ0IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCAiODUwIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpMT0NWQUwoTE9DQUxFX1NMSVNULCAiLCIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsICIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwgIi4iKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwgIiwiKQpMT0NWQUwoTE9DQUxFX1NHUk9VUElORywgIjM7MCIpCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIsICIxIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTLCAiMDEyMzQ1Njc4OSIpCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCAioyIpCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsICJHQlAiKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCAiLiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCAiLCIpCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HLCAiMzswIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCAiMSIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsICIvIikKTE9DVkFMKExPQ0FMRV9TVElNRSwgIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsICJkZC9NTS95eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCAiZGQgTU1NTSB5eXl5IikKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwgIkhIOm1tOnNzIikKTE9DVkFMKExPQ0FMRV9JREFURSwgIjEiKQpMT0NWQUwoTE9DQUxFX0lMREFURSwgIjEiKQpMT0NWQUwoTE9DQUxFX0lUSU1FLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX1MxMTU5LCAiQU0iKQpMT0NWQUwoTE9DQUxFX1MyMzU5LCAiUE0iKQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUsICIxIikKTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSywgIjAiKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIsICIwIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsICJNb25kYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwgIlR1ZXNkYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywgIldlZG5lc2RheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCAiVGh1cnNkYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwgIkZyaWRheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCAiU2F0dXJkYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywgIlN1bmRheSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCAiTW9uIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsICJUdWUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywgIldlZCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCAiVGh1IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsICJGcmkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwgIlNhdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCAiU3VuIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwgIkphbnVhcnkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCAiRmVicnVhcnkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCAiTWFyY2giKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCAiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCAiTWF5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwgIkp1bmUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCAiSnVseSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsICJBdWd1c3QiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCAiU2VwdGVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsICJPY3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsICJOb3ZlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCAiRGVjZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywgIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsICJKYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCAiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywgIk1hciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsICJBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCAiTWF5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwgIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsICJKdWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCAiQXVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwgIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCAiT2N0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsICJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwgIkRlYyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCAiIikKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOLCAiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOLCAiMyIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UsICIwIikKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSwgIjAiKQoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKDB4MDgwOSkgKFUuSy4gRW5nbGlzaCkgKi8KCiAgICBjYXNlIExBTkdfS286IC8qIHN0cmluZyB1c2luZyBjb2RlcGFnZSA5NDkgKi8KICAgICAgICBzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMTgiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiXDMwN1wzMjFcMjYxXDI3MVwyNzZcMzU2IikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIktvcmVhbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJLT1IiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiXDMwN1wzMjFcMjYxXDI3MVwyNzZcMzU2IikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiODIiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJcMjY0XDM1M1wzMDdcMzIxXDI3MVwzMTZcMjYxXDI3MSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIktvcmVhIChTb3V0aCkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiS09SIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlwyNjRcMzUzXDMwN1wzMjFcMjcxXDMxNlwyNjFcMjcxIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIxOCIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI4MiIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiOTQ5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiOTQ5IikKTE9DVkFMKExPQ0FMRV9TTElTVCwiLCIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIuIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIiwiKQpMT0NWQUwoTE9DQUxFX1NHUk9VUElORywiMzswIikKTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIsIjEiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMsIjAxMjM0NTY3ODkiKQpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiXFwiKQpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MLCJXb24iKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCIuIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsIiwiKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORywiMzswIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLyIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsInl5eXkvTU0vZGQiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwieXl5eS9NTS9kZCIpCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQsImg6bW06c3MgdHQiKQpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKTE9DVkFMKExPQ0FMRV9JTERBVEUsIjEiKQpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOLCIwIikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSwiMCIpCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMCIpCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPLCIwIikKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8sIjAiKQpMT0NWQUwoTE9DQUxFX1MxMTU5LCJcMjc3XDMwMFwzMDBcMzc0IikKTE9DVkFMKExPQ0FMRV9TMjM1OSwiXDI3N1wzMDBcMzEwXDMwNCIpCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSwiMSIpCi8qIEtvcmVhbiBUYW5ndW4gRXJhIGNhbGVuZGFyICovCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsIjUiKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSywiNiIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUiwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJcMjc3XDM3MVwyNzdcMzQ0XDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiXDMxMFwyNTVcMjc3XDM0NFwzMDBcMzE3IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIlwyNzRcMzY2XDI3N1wzNDRcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJcMjcwXDM2MVwyNzdcMzQ0XDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiXDI2MVwzMzVcMjc3XDM0NFwzMDBcMzE3IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIlwzMDVcMzQ0XDI3N1wzNDRcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJcMzAwXDMxN1wyNzdcMzQ0XDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiXDMxMFwyNTUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiXDI3NFwzNjYiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiXDI3MFwzNjEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiXDI2MVwzMzUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiXDMwNVwzNDQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiXDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCIxXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCIyXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCIzXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCI0XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCI1XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCI2XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCI3XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCI4XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCI5XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiMTBcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCIxMVwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIjEyXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiMVwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiMlwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiM1wyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiNFwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiNVwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiNlwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiN1wyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiOFwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiOVwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIjEwXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiMTFcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCIxMlwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwiIikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwiMCIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTLCIzIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSwiMCIpCiAgICAgICAgZGVmYXVsdDogZm91bmQ9MDticmVhazsKICAgICAgICB9CiAgICBicmVhazsgIC8qIExBTkcoS28pICovCgogICAgY2FzZSBMQU5HX0h1OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIk1hZ3lhciIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJIdW5nYXJpYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiaHVuIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIk1hZ3lhciIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjM2IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiTWFneWFyb3JzeuFnIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiSHVuZ2FyeSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJIdSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJNYWd5YXJvcnN64WciKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiMzYiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MiIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsIjg1MiIpCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIsIikKLyoKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKQpJcyB0aGlzICIwMTIzNDU2Nzg5IiA/PwpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJGdCIpCi8qCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMCIpCi8qCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIvIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwieXl5eS5NTS5kZCIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIHl5eXkuIE1NTU0gZCIpCi8qCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCiovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lMREFURSkKKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKQpMT0NWQUwoTE9DQUxFX1MxMTU5KQpMT0NWQUwoTE9DQUxFX1MyMzU5KQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJI6XRm9SIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJLZWRkIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIlN6ZXJkYSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJDc/x09nJ09msiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiUOludGVrIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIlN6b21iYXQiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiVmFz4XJuYXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiSOkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiS2UiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiU2UiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiQ3MiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiUOkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiU28iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiVmEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCJKYW514XIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydeFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTeFyY2l1cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsIsFwcmlsaXMiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJN4Wp1cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkr6bml1cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIkr6bGl1cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzenR1cyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlN6ZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2t082JlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEZWNlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJKYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJN4XIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCLBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJN4WoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJK+m4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJK+mwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTemUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2t0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEZWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyoKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoqLwoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhFbikgKi8KCiAgICBjYXNlIExBTkdfUGw6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiUG9sc2tpIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIlBvbGlzaCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAicG9sIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIlBvbHNraSIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiUG9sc2thIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiUG9sYW5kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIlBsIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlBvbHNrYSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0OSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiMTI1MiIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsIjEyNTIiKQpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiICIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwielx4QjMiKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKTE9DVkFMKExPQ0FMRV9TMTE1OSkKTE9DVkFMKExPQ0FMRV9TMjM1OSkKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiUG9uaWVkemlhXDI2M2VrIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIld0b3JlayIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJTcm9kYSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJDendhcnRlayIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJQaVx4Qjl0ZWsiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiU29ib3RhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIk5pZWR6aWVsYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJQbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJXdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJTciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJDeiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJQdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJOaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIlN0eWN6ZVx4RjEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJMdXR5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTWFyemVjIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiS3dpZWNpZVx4RjEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJDemVyd2llYyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIkxpcGllYyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIlNpZXJwaWVceEYxIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiV3J6ZXNpZVx4RjEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiUGFcMjM3ZHppZXJuaWsiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTGlzdGFwYWQiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiR3J1ZHppZVx4RjEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiU3R5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiTHV0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiS3dpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFqIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiQ3plIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiTGlwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiU2llIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiV3J6IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIlBhXHg5RiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJMaXMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiR3J1IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKi8KCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoUGwpICovCgogICAgY2FzZSBMQU5HX1BvOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDQxNiIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCAiUG9ydHVndVwzNTJzIChCcmFzaWwpIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJQcm90dWd1ZXNlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsICJQT1IiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwgIlBvcnR1Z3VcMzUycyIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksICIxIikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwgIkJyYXNpbCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJCcmF6aWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwgIkJSQSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiQnJhc2lsIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDQwOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjQzNyIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsICIxMjUyIikKTE9DVkFMKExPQ0FMRV9TTElTVCwgIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsICIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsICIuIikKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcsICIzOzAiKQpMT0NWQUwoTE9DQUxFX0lESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sICIxIikKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSLCAiMSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUywgIjAxMjM0NTY3ODkiKQpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwgIiQiKQpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MLCAiVVNEIikKTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCwgIiwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwgIi4iKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORywgIjM7MCIpCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMsICIyIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksICIwIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwgIjAiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCAiLyIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsICI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCAiZGQvTU0veXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwgImRkZGQsIE1NTU0gZGQsIHl5eXkiKQpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFULCAiaDptbTpzcyB0dCIpCkxPQ1ZBTChMT0NBTEVfSURBVEUsICIwIikKTE9DVkFMKExPQ0FMRV9JTERBVEUsICIwIikKTE9DVkFMKExPQ0FMRV9JVElNRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04sICIwIikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKTE9DVkFMKExPQ0FMRV9TMjM1OSwgIlBNIikKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsICIwIikKTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUssICI2IikKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCAiU2VndW5kYSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCAiVGVyXDM0N2EiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywgIlF1YXJ0YSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCAiUXVpbnRhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsICJTZXh0YSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCAiU1wzNDFiYWRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsICJEb21pbmdvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsICJTZWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwgIlRlciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCAiUXVhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsICJRdWkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwgIlNleCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCAiU1wzNDFiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsICJEb20iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCAiSmFuZWlybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsICJGZXZlcmVpcm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCAiTWFyXDM0N28iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCAiQWJyaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCAiTWFpbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsICJKdW5obyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsICJKdWxobyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsICJBZ29zdG8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCAiU2V0ZW1icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwgIk91dHVicm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwgIk5vdmVtYnJvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsICJEZXplbWJybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCAiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsICJGZXYiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCAiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwgIkFiciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsICJNYWkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCAiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywgIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsICJBZ28iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCAiU2V0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsICJPdXQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwgIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCAiRGV6IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsICIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIwIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoUG8pICovCgpjYXNlIExBTkdfU3c6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjFkIikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIlN2ZW5za2EiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiU3dlZGlzaCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJTViIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJTdmVuc2thIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDUiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJTV0UiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJTd2VkZW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiU1ZFIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlN2ZXJpZ2UiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjFkIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ1IikKLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKSAqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwia3IiKQovKiBMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKSAqLwpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCIsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsIi4iKQovKiBMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykgKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qIExPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQvTU0teXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qIExPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpICovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lMREFURSkgKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkgKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pICovCi8qIExPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKSAqLwpMT0NWQUwoTE9DQUxFX1MxMTU5LCAiIikKTE9DVkFMKExPQ0FMRV9TMjM1OSwgIiIpCi8qIExPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkgKi8KLyogTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspICovCi8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikgKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk3lbmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJUaXNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiT25zZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIlRvcnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIkz2cmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJT9m5kYWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiTeUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiVGkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiT24iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiVG8iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiRnIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiTPYiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiU/YiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCJKYW51YXJpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiRmVicnVhcmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJNYXJzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSnVsaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdGkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJTZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2t0b2JlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEZWNlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJKYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJKdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJKdWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2t0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEZWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOLCAiLSIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOLCAiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOLCAiMyIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UsICIwIikKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSwgIjAiKQoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKFN3KSAqLwoKLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwoKICAgIGRlZmF1bHQ6CiAgICAJZm91bmQ9MDsKCWJyZWFrOwogICAgfSAgLyogc3dpdGNoICovCgoJaWYoIWZvdW5kKSB7CgkJRVJSKG9sZSwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlLlxuIiwKCQkJcmV0U3RyaW5nKTsKCQlyZXRTdHJpbmcgPSAiPFdJTkUtTkxTLXVua25vd24+IjsKCQkvKnJldHVybiAwOyovCgl9CglpZiAoYnVmKQoJCWxzdHJjcHluMzJBKGJ1ZixyZXRTdHJpbmcsbGVuKTsKCXJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvMzJXICAgICAgICAgICAgIChLRVJORUwzMi4yMzApCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQzMiBsZW4pCnsKCUxQU1RSIGFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoKCUlOVDMyIG4gPSBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCWlmICh3YnVmKQoJCWxzdHJjcHluQXRvVyh3YnVmLGFidWYsbGVuKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxhYnVmKTsKCXJldHVybiBuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQogKi8KVUlOVDE2IFdJTkFQSSBDb21wYXJlU3RyaW5nMTYoRFdPUkQgbGNpZCxEV09SRCBmZHdTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKewoJcmV0dXJuIChVSU5UMTYpQ29tcGFyZVN0cmluZzMyQShsY2lkLGZkd1N0eWxlLHMxLGwxLHMyLGwyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMzJBICAgKEtFUk5FTDMyLjI5KQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRQogKi8KVUlOVDMyIFdJTkFQSSBDb21wYXJlU3RyaW5nMzJBKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzMSwgRFdPUkQgbDEsIExQQ1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUob2xlLCAiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwgIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KCQlsc3RybmNtcGkzMkEoczEsczIsbGVuKQk6IGxzdHJuY21wMzJBKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MClyZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMilyZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzMyVyAgICAgICAoS0VSTkVMMzIuMzApCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMlcoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlbjMyVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW4zMlcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCWxzdHJuY21waTMyVyhzMSxzMixsZW4pCTogbHN0cm5jbXAzMlcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldExvY2FsZUluZm9BICAgICAgIFtLRVJORUwzMi40OTldCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKG9sZSwiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgSXNWYWxpZExvY2FsZSAgICAgICBbS0VSTkVMMzIuMzYxXQogKi8KQk9PTDMyIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewoJLyogd2Ugc3VwcG9ydCBBTlkgbGFuZ3VhZ2UuIFdlbGwsIGF0IGxlYXN0IHNheSB0aGF0Li4uKi8KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi45M10KICovCkJPT0wzMiBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXMzMlcoIExPQ0FMRV9FTlVNUFJPQzMyVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wzMglyZXQ7CglXQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleTMyVyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIExQV1NUUiBjcDsKCSAgICBjaGFyICAgeGJ1ZmZlclsxMF07CiAgCQoJICAgIHNwcmludGYoeGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCgkgICAgY3AgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIHhidWZmZXIgKTsKICAgICAgICAgICAgcmV0ID0gbHBmbkxvY2FsZUVudW0oY3ApOwogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3AgKTsKICAgICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgICAgICAgICBpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtU3lzdGVtTG9jYWxlczMyQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuOTJdCiAqLwpCT09MMzIgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzMzJBKExPQ0FMRV9FTlVNUFJPQzMyQSBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncykKewoJaW50CWk7CglDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIiwKCQlscGZuTG9jYWxlRW51bSxmbGFncwoJKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5MzJBKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ25hbWUhPU5VTEwpIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIFtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuMjc3XQogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlMzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlRXhBICAgICAgICAgICAgICAgIFtLRVJORUwzMi4yNzZdCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUUob2xlLCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJaWYgKGNjaFNyYz09LTEpCgkJY2NoU3JjPWxzdHJsZW4zMkEoc3JjKTsKCWZvciAoaT0wO2k8Y2NoU3JjO2krKykgewoJCWNoYXJ0eXBlW2ldID0gMDsKCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkJaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkJaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCiAgICAgICAgICAgICAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCQkvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRTdHJpbmdUeXBlVyBbS0VSTkVMMzIuMjc5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGUzMlcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQzMiBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMlcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBHZXRTdHJpbmdUeXBlVyAgIFtLRVJORUwzMi4yNzhdCiAqIEZJWE1FOiB1bmljb2RlIGNoYXJzIGFyZSBhc3N1bWVkIGNoYXJzCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUyOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRShvbGUsIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJZGVmYXVsdDpicmVhazsKCX0KCWlmIChjY2hTcmM9PS0xKQoJCWNjaFNyYz1sc3RybGVuMzJXKHNyYyk7Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTE2ICAgW1ZFUi4xMF0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMTYoVUlOVDE2IGxhbmdpZCxMUFNUUiBsYW5nbmFtZSxVSU5UMTYgbGFuZ25hbWVsZW4pCnsKCWludAlpOwoJY2hhcgkqYnVmOwoKCVRSQUNFKHZlciwiKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJLyogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CgkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCgkgKi8KCWJ1Zj0oY2hhciopbWFsbG9jKHN0cmxlbigiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIikrOSk7CglzcHJpbnRmKGJ1ZiwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsbGFuZ2lkKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdRdWVyeVZhbHVlMTYoSEtFWV9MT0NBTF9NQUNISU5FLGJ1ZixsYW5nbmFtZSwoTFBEV09SRCkmbGFuZ25hbWVsZW4pKSB7CgkJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCQlyZXR1cm4gbGFuZ25hbWVsZW47Cgl9CgkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVyYWwgdGFibGUgKi8KCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCWJyZWFrOwoJc3RybmNweShsYW5nbmFtZSxsYW5ndWFnZXNbaV0ubGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCXJldHVybiBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTMyQQkJCQlbVkVSU0lPTi45XSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMkEoVUlOVDMyIGxhbmdpZCxMUFNUUiBsYW5nbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbGFuZ25hbWVsZW4pCnsKCXJldHVybiBWZXJMYW5ndWFnZU5hbWUxNihsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVmVyTGFuZ3VhZ2VOYW1lMzJXCQkJCVtWRVJTSU9OLjEwXSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMlcoVUlOVDMyIGxhbmdpZCxMUFdTVFIgbGFuZ25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhbmduYW1lbGVuKQp7CglpbnQJaTsKCWNoYXIJYnVmZmVyWzgwXTsKCUxQV1NUUglrZXluYW1lOwoKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglzcHJpbnRmKGJ1ZmZlciwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsbGFuZ2lkKTsKCWtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ1F1ZXJ5VmFsdWUzMlcoSEtFWV9MT0NBTF9NQUNISU5FLGtleW5hbWUsbGFuZ25hbWUsKExQRFdPUkQpJmxhbmduYW1lbGVuKSkgewoJCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CgkJcmV0dXJuIGxhbmduYW1lbGVuOwoJfQogICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CgkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVyYWwgdGFibGUgKi8KCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCWJyZWFrOwogICAgICAgIGxzdHJjcHlBdG9XKCBsYW5nbmFtZSwgbGFuZ3VhZ2VzW2ldLmxhbmduYW1lICk7CglyZXR1cm4gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7IC8qIHNhbWUgYXMgc3RybGVuVyhsYW5nbmFtZSk7ICovCn0KCgpJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMkEoCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDU1RSIHNyY3N0cixJTlQzMiBzcmNsZW4sTFBTVFIgZHN0c3RyLAoJSU5UMzIgZHN0bGVuCikgewoJaW50CWksbGVuOwoKCVRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCgkJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoJaWYgKCFkc3RsZW4gfHwgIWRzdHN0cikgewoJCWRzdHN0ciA9IChMUFNUUilzcmNzdHI7Cgl9CglpZiAoIXNyY2xlbikgc3JjbGVuID0gc3RybGVuKHNyY3N0cik7CglpZiAoIWRzdGxlbikgZHN0bGVuID0gc3RybGVuKGRzdHN0cik7CglsZW4gPSBkc3RsZW47CglpZiAoc3JjbGVuIDwgbGVuKQoJCWxlbiA9IHNyY2xlbjsKCWlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkgewoJCWZvciAoaT0wO2k8bGVuO2krKykKCQkJZHN0c3RyW2ldPXRvbG93ZXIoc3Jjc3RyW2ldKTsKCQltYXBmbGFncyAmPSB+TENNQVBfTE9XRVJDQVNFOwoJfQoJaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKSB7CgkJZm9yIChpPTA7aTxsZW47aSsrKQoJCQlkc3RzdHJbaV09dG91cHBlcihzcmNzdHJbaV0pOwoJCW1hcGZsYWdzICY9IH5MQ01BUF9VUFBFUkNBU0U7Cgl9CglpZiAobWFwZmxhZ3MpCgkgIHsKCSAgICBGSVhNRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCQkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKCSAgfQoJcmV0dXJuIGxlbjsKfQoKLyogRklYTUU6IGltcGxlbWVudCBldmVyeWh0aW5nICYgY29ycmVjdCAqLwoKSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVDMyIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UMzIgZHN0bGVuCikgewoJaW50CWksbGVuOwoKCVRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCgkJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4KCSk7CglpZiAoIWRzdGxlbiB8fCAhZHN0c3RyKSB7CgkJZHN0c3RyID0gKExQV1NUUilzcmNzdHI7Cgl9CglpZiAoIXNyY2xlbikgc3JjbGVuID0gbHN0cmxlbjMyVyhzcmNzdHIpOwoJaWYgKCFkc3RsZW4pIGRzdGxlbiA9IGxzdHJsZW4zMlcoZHN0c3RyKTsKCWxlbiA9IGRzdGxlbjsKCWlmIChzcmNsZW4gPCBsZW4pCgkJbGVuID0gc3JjbGVuOwoJaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKSB7CgkJZm9yIChpPTA7aTxsZW47aSsrKQoJCQlkc3RzdHJbaV09dG9sb3dlcihzcmNzdHJbaV0pOwoJCW1hcGZsYWdzICY9IH5MQ01BUF9MT1dFUkNBU0U7Cgl9CglpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpIHsKCQlmb3IgKGk9MDtpPGxlbjtpKyspCgkJCWRzdHN0cltpXT10b3VwcGVyKHNyY3N0cltpXSk7CgkJbWFwZmxhZ3MgJj0gfkxDTUFQX1VQUEVSQ0FTRTsKCX0KCWlmIChtYXBmbGFncykKCSAgewoJICAgIEZJWE1FKG9sZSwiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCQkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJCSAgbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4sbWFwZmxhZ3MpOwoJICB9CglyZXR1cm4gbGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIE9MRV9HZXRGb3JtYXRBKCkgW2ludGVybmFsXQoKCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQgCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuIAoKICovCgpJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBmb3JtYXQsIAoJCQkgICAgTFBTVFIgZGF0ZSwgSU5UMzIgZGF0ZWxlbikKewogICBJTlQzMiBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsgCgogICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KICAgVFJBQ0Uob2xlLCAiZnVuYyglOGx4LCU4bHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDpcJyVzXCcgKGF0ICVwKSwgJXAgKCU5cyksIGxlbj0lZClcbiIsIGxvY2FsZSwgZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGZvcm1hdCwgZm9ybWF0LCBkYXRlLCBkYXRlLCBkYXRlbGVuKTsKICAKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgZm9yIChpbnBvcyA9IDA7OyBpbnBvcysrKSB7CiAgICAgIC8qIFRSQUNFKG9sZSwgIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAoJCQkJCSAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxIAoJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKG9sZSwKCQkJICAgICAgInVua25vd24gZm9ybWF0LFwKYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk4ob2xlLAoJCQkgICAgICAgInVua25vd24gZm9ybWF0LCBcCmM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMikgewoJCSAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwKCQkJCSAgICh4dGltZS0+d0hvdXI8MTIpIAoJCQkJICAgPyBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9CgkgICAgfTsKCgkgICAgLyogd2UgbmVlZCB0byBjaGVjayB0aGUgbmV4dCBjaGFyIGluIHRoZSBmb3JtYXQgc3RyaW5nIAoJICAgICAgIGFnYWluLCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCAqLwoJICAgIGlucG9zLS07CgkgICAgCgkgICAgLyogYWRkIHRoZSBjb250ZW50cyBvZiBidWYgdG8gdGhlIG91dHB1dCAqLwoJICAgIGJ1ZmxlbiA9IHN0cmxlbihidWYpOwoJICAgIGlmIChvdXRwb3MgKyBidWZsZW4gPCBkYXRlbGVuKSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsgLyogZm9yIHN0cmNhdCB0byBob29rIG9udG8gKi8KCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CgkgICAgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSAgICB9IGVsc2UgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgICAgc3RybmNhdChkYXRlLCBidWYsIGRhdGVsZW4gLSBvdXRwb3MpOwoJCSBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CgkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgICBXQVJOKG9sZSwgImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CiAgIAogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CiAgIAogICBUUkFDRShvbGUsICJPTEVfR2V0Rm9ybWF0QSByZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsCgkgICAgICAgZGF0ZSwgb3V0cG9zKTsKICAgcmV0dXJuIG91dHBvczsKfQoKLyogIE9MRV9HZXRGb3JtYXRXICBbaW50ZXJuYWxdICAqLwoKSU5UMzIgV0lOQVBJIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UMzIgb3V0bGVuKQp7CiAgIElOVDMyICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZSwgaW5xdW90ZTsKICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICBpbnQgdXNlZGF0ZSwgdXNldGltZTsKICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1ZmxlbjsKICAgY2hhciAgICBhYnVmWzQwXTsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyW10gPSB7YXJnMCwgYXJnMSwgYXJnMn07CiAgIGludCAgICAgZGF0ZXZhcnMsIHRpbWV2YXJzOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBsc3RyY3B5bld0b0EoYWJ1ZiwgZm9ybWF0LCBzaXplb2YoZm9ybWF0KSk7CiAgIFRSQUNFKG9sZSwgImFyZ3M6ICU4bHgsICU4bHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDpcJyVzXCcgKGF0ICVwKSwgJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBhYnVmLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKICAgCgogICAvKiBpbml0aWFsaXplIHN0YXRlIHZhcmlhYmxlcyAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsKICAgaW5xdW90ZSA9IE92ZXJmbG93ID0gMDsKICAgLyogdGhpcyBpcyByZWFsbHkganVzdCBhIHNhbml0eSBjaGVjayAqLwogICBvdXRwdXRbMF0gPSBidWZbMF0gPSAwOwogICBhYnVmWzBdID0gJ1wwJzsKICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvZmZpY2lhbCBXaW5kb3dzIGJlaGF2aW9yICovCiAgIHVzZWRhdGUgPSBmbGFncyAmIERBVEVfREFURVZBUlNPTkxZOwogICB1c2V0aW1lID0gZmxhZ3MgJiBUSU1FX1RJTUVWQVJTT05MWTsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKCSBpZiAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArIHh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQl4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJCWJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndEYXkgKTsKCSAgICB9OwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA2LCBhcmdhcnJbMV0gLyogIiVkIiAqLywKCQkJIHh0aW1lLT53WWVhcik7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgInl5eSIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNiwgYXJnYXJyW2NvdW50XSwKCQkJICAgIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCSAgICAgICBGSVhNRShvbGUsICJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiQUQiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiZyIsIDUpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgLyogaG91cnMgMTowMC0xMjowMCAtLS0gaXMgdGhpcyByaWdodD8gKi8KCSAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJIHh0aW1lLT53SG91cik7CgkgfSBlbHNlIGlmICh0eXBlID09ICdtJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d1NlY29uZCk7CgkgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuMzJXKGJ1Zik7CgkgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewoJICAgIG91dHB1dFtvdXRwb3NdID0gMDsgIC8qIGEgImhvb2siIGZvciBzdHJjYXQgKi8KCSAgICBsc3RyY2F0MzJXKG91dHB1dCwgYnVmKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvc10gPSAwOwoJICAgIGxzdHJjYXRuMzJXKG91dHB1dCwgYnVmLCBvdXRsZW4gLSBvdXRwb3MpOwoJICAgIG91dHB1dFtvdXRsZW4gLSAxXSA9IDA7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk4ob2xlLCAiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIGxzdHJjcHluV3RvQShhYnVmLCBvdXRwdXQsIHNpemVvZihhYnVmKSApOwogICBUUkFDRShvbGUsICIgcmV0dXJuaW5nIHN0cmluZyBcJyVzXCdcbiIsIGFidWYpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXREYXRlRm9ybWF0MzJBKCkgW0tFUk5FTDMyLjMxMF0gTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KCklOVDMyIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UMzIgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKCiAgSU5UMzIgcmV0OwoKICBUUkFDRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvMzJBKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0Uob2xlLCAKCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXREYXRlRm9ybWF0MzJXKCkgW0tFUk5FTDMyLjMxMV0gTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXQzMkEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVDMyIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgICBMUFdTVFIgZGF0ZSwgSU5UMzIgZGF0ZWxlbikKewogICBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKG9sZSwgIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluMzJXKGRhdGUsIGRhdGVhcnIsIGRhdGVsZW4pOwogICByZXR1cm4gKCAgZGF0ZWxlbiA8IDkpID8gZGF0ZWxlbiA6IDk7CiAgIAogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJBCShLRVJORUwzMi4zNTUpCiAqLwpJTlQzMiBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0MzJBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICBjaGFyICpscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQovKiBOT1RFOiB0eXBlIG9mIGxwRm9ybWF0IHNob3VsZCBiZSBDT05TVCBOVU1CRVJGT1JNQVQgKi8KCnsKIGludCBuOwoKIEZJWE1FKGZpbGUsIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIG4gPSBzdHJsZW4obHB2YWx1ZSk7CiBpZiAoY2NoTnVtYmVyKSB7IAogICBzdHJuY3B5KGxwTnVtYmVyU3RyLGxwdmFsdWUsY2NoTnVtYmVyKTsKICAgaWYgKGNjaE51bWJlciA8PSBuKSB7CiAgICAgbHBOdW1iZXJTdHJbY2NoTnVtYmVyLTFdID0gMDsKICAgICBuID0gY2NoTnVtYmVyLTE7CiAgIH0KIH0KIHJldHVybiBuOwp9CiAKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogR2V0VGltZUZvcm1hdDMyQSgpIFtLRVJORUwzMi40MjJdIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KCklOVDMyIFdJTkFQSSAKR2V0VGltZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UMzIgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7CiAgIExQQ1NUUiByZWFsZm9ybWF0OwogICBjaGFyIGZtdF9idWZbNDBdOwogICAKICAgVFJBQ0Uob2xlLCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4pOwogICAKICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAoJCSAgICAgICBmbXRfYnVmLCAgc2l6ZW9mKGZtdF9idWYpKTsKICAgICAgcmVhbGZvcm1hdCA9IGZtdF9idWY7CiAgIH0gZWxzZSB7CiAgICAgIFdBUk4ob2xlLCAiQ2FsbGVyIGdhdmUgbm8gbG9jYWxlIGFuZCBubyBmb3JtYXRcbiIpOwogICAgICByZWFsZm9ybWF0ID0gImhoOm1tOnNzIjsKICAgfTsKICAgaWYgKCFsb2NhbGUpIHsKICAgICAgbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgfQogICByZXR1cm4gT0xFX0dldEZvcm1hdEEobG9jYWxlLCBmbGFncywgeHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsIHRpbWVsZW4pOwp9CgoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgR2V0VGltZUZvcm1hdDMyVygpICBbS0VSTkVMMzIuNDIzXSBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqIAoKICoKICovCgpJTlQzMiBXSU5BUEkgCkdldFRpbWVGb3JtYXQzMlcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsIAoJCQkgICAgICBMUFdTVFIgdGltZXN0cixJTlQzMiB0aW1lbGVuKSAKewogICBjaGFyIGRlYnVnYnVmWzQwXTsKICAgV0NIQVIgYnVmWzIwXTsKICAgTFBDV1NUUiByZWFsZm9ybWF0OwogICBTWVNURU1USU1FIHQ7CiAgIExQU1lTVEVNVElNRSByZWFsdGltZTsKICAgV0NIQVIgKiBmbXRfYnVmID0gTlVMTDsKICAgaW50IGZtdF9idWZfc2l6ZSA9IDA7IC8qIHVuaXRzIG9mIFdDSEFScyAqLwogICBJTlQzMiByZXR2YWw7CiAgIAogICBsc3RyY3B5bld0b0EoZGVidWdidWYsIGZvcm1hdCwgKHNpemVvZihidWYpKS8yKTsKICAgVFJBQ0Uob2xlLCAiR2V0VGltZUZvcm1hdFcgbGVuICVkIGZsYWdzIDB4JWxYIGZvcm1hdCA+JXM8XG4iLAoJCXRpbWVsZW4sIGZsYWdzLCBkZWJ1Z2J1Zik7CgogICAvKiBFbmZvcmNlIHRoZSBXaW5kb3dzIGJlaGF2aW9yICovCiAgIGZsYWdzIHw9IH5MT0NBTEVfVElNRURBVEVCT1RIOwogICBmbGFncyB8PSBUSU1FX1RJTUVWQVJTT05MWTsKCiAgIC8qIHRha2UgY2FyZSBvZiB0aGUgZm9ybWF0IG9yIGxvY2FsZSBub3QgYmVpbmcgZ2l2ZW4gKi8KICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgZm10X2J1ZiA9IG1hbGxvYygoZm10X2J1Zl9zaXplKz03KSAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAoIWZtdF9idWYpIHsKCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgV0FSTihvbGUsICJjb3VsZCBub3QgYWxsb2NhdGUgJWQgY2hhcnMgb2YgbWVtb3J5XG4iLCBmbXRfYnVmX3NpemUpOyAKCSByZXR1cm4gMDsKICAgICAgfTsKICAgICAgd2hpbGUoIUdldExvY2FsZUluZm8zMlcobG9jYWxlLCBMT0NBTEVfU1RJTUVGT1JNQVQsCgkJCSAgICAgIGZtdF9idWYsIGZtdF9idWZfc2l6ZSkpIHsKCSBmbXRfYnVmID0gcmVhbGxvYyhmbXRfYnVmLCAKCQkJICAgKGZtdF9idWZfc2l6ZSArPSAxMCkgKiBzaXplb2YoV0NIQVIpKTsKCSBpZiAoIWZtdF9idWYpIHsKCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfT1VUT0ZNRU1PUlkpOwoJICAgIFdBUk4ob2xlLCAiY291bGQgbm90IGFsbG9jYXRlICVkIGNoYXJzIG9mIG1lbW9yeVxuIiwgZm10X2J1Zl9zaXplKTsgCgkgICAgcmV0dXJuIDA7CgkgfTsKICAgICAgfTsKICAgICAgcmVhbGZvcm1hdCA9IGZtdF9idWY7CiAgIH0gZWxzZSB7CiAgICAgIEZJWE1FKG9sZSwgICJjYWxsZXIgZ2F2ZSBubyBsb2NhbGUsICBubyBmb3JtYXQ7ICB3aGF0IHNob3VsZCB3ZSBkbz9cbiIpOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQkFEX0ZPUk1BVCk7CiAgIH07CiAgIGlmICghbG9jYWxlKSB7CiAgICAgIGxvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cn0KCiAgIHJlYWx0aW1lID0geHRpbWU7CiAgIGlmICghcmVhbHRpbWUpIHsKICAgICAgcmVhbHRpbWUgPSAmdDsKICAgICAgR2V0U3lzdGVtVGltZShyZWFsdGltZSk7CiAgIH07CgoKICAgcmV0dmFsID0gT0xFX0dldEZvcm1hdFcobG9jYWxlLCBmbGFncywgcmVhbHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsICB0aW1lbGVuKTsKICAgaWYgKGZtdF9idWYpIGZyZWUoZm10X2J1Zik7CiAgIHJldHVybiByZXR2YWw7Cn0K