LyoKICogTm9uLWNsaWVudCBhcmVhIHdpbmRvdyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgIndpbi5oIgojaW5jbHVkZSAidXNlci5oIgojaW5jbHVkZSAiZGNlLmgiCiNpbmNsdWRlICJjb250cm9scy5oIgojaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgojaW5jbHVkZSAid2lucG9zLmgiCiNpbmNsdWRlICJob29rLmgiCiNpbmNsdWRlICJub25jbGllbnQuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgInNoZWxsYXBpLmgiCiNpbmNsdWRlICJiaXRtYXAuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG5vbmNsaWVudCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKHNoZWxsKTsKCkJPT0wgTkNfRHJhd0dyYXlCdXR0b24oSERDIGhkYywgaW50IHgsIGludCB5KTsKCnN0YXRpYyBIQklUTUFQIGhiaXRtYXBDbG9zZTsKCnN0YXRpYyBjb25zdCBCWVRFIGxwR3JheU1hc2tbXSA9IHsgMHhBQSwgMHhBMCwKCQkgICAgICAweDU1LCAweDUwLAoJCSAgICAgIDB4QUEsIDB4QTAsCgkJICAgICAgMHg1NSwgMHg1MCwKCQkgICAgICAweEFBLCAweEEwLAoJCSAgICAgIDB4NTUsIDB4NTAsCgkJICAgICAgMHhBQSwgMHhBMCwKCQkgICAgICAweDU1LCAweDUwLAoJCSAgICAgIDB4QUEsIDB4QTAsCgkJICAgICAgMHg1NSwgMHg1MH07CgojZGVmaW5lIFNDX0FCT1VUV0lORSAgICAJKFNDX1NDUkVFTlNBVkUrMSkKI2RlZmluZSBTQ19QVVRNQVJLICAgICAJCShTQ19TQ1JFRU5TQVZFKzIpCgogIC8qIFNvbWUgdXNlZnVsIG1hY3JvcyAqLwojZGVmaW5lIEhBU19ETEdGUkFNRShzdHlsZSxleFN0eWxlKSBcCiAgICAoKChleFN0eWxlKSAmIFdTX0VYX0RMR01PREFMRlJBTUUpIHx8IFwKICAgICAoKChzdHlsZSkgJiBXU19ETEdGUkFNRSkgJiYgISgoc3R5bGUpICYgV1NfVEhJQ0tGUkFNRSkpKQoKI2RlZmluZSBIQVNfVEhJQ0tGUkFNRShzdHlsZSxleFN0eWxlKSBcCiAgICAoKChzdHlsZSkgJiBXU19USElDS0ZSQU1FKSAmJiBcCiAgICAgISgoKHN0eWxlKSAmIChXU19ETEdGUkFNRXxXU19CT1JERVIpKSA9PSBXU19ETEdGUkFNRSkpCgojZGVmaW5lIEhBU19USElORlJBTUUoc3R5bGUpIFwKICAgICgoKHN0eWxlKSAmIFdTX0JPUkRFUikgfHwgISgoc3R5bGUpICYgKFdTX0NISUxEIHwgV1NfUE9QVVApKSkKCiNkZWZpbmUgSEFTX0JJR0ZSQU1FKHN0eWxlLGV4U3R5bGUpIFwKICAgICgoKHN0eWxlKSAmIChXU19USElDS0ZSQU1FIHwgV1NfRExHRlJBTUUpKSB8fCBcCiAgICAgKChleFN0eWxlKSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKQoKI2RlZmluZSBIQVNfU1RBVElDT1VURVJGUkFNRShzdHlsZSxleFN0eWxlKSBcCiAgICAoKChleFN0eWxlKSAmIChXU19FWF9TVEFUSUNFREdFfFdTX0VYX0RMR01PREFMRlJBTUUpKSA9PSBcCiAgICAgV1NfRVhfU1RBVElDRURHRSkKCiNkZWZpbmUgSEFTX0FOWUZSQU1FKHN0eWxlLGV4U3R5bGUpIFwKICAgICgoKHN0eWxlKSAmIChXU19USElDS0ZSQU1FIHwgV1NfRExHRlJBTUUgfCBXU19CT1JERVIpKSB8fCBcCiAgICAgKChleFN0eWxlKSAmIFdTX0VYX0RMR01PREFMRlJBTUUpIHx8IFwKICAgICAhKChzdHlsZSkgJiAoV1NfQ0hJTEQgfCBXU19QT1BVUCkpKQoKI2RlZmluZSBIQVNfTUVOVSh3KSAgKCEoKHcpLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICgodyktPndJRG1lbnUgIT0gMCkpCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOQ19BZGp1c3RSZWN0CiAqCiAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyByZWN0YW5nbGUgZnJvbSB0aGUgc2l6ZSBvZiB0aGUKICogY2xpZW50IHJlY3RhbmdsZS4KICovCnN0YXRpYyB2b2lkIE5DX0FkanVzdFJlY3QoIExQUkVDVCByZWN0LCBEV09SRCBzdHlsZSwgQk9PTCBtZW51LCBEV09SRCBleFN0eWxlICkKewogICAgaWYgKFRXRUFLX1dpbmVMb29rID4gV0lOMzFfTE9PSykKCUVSUigiQ2FsbGVkIGluIFdpbjk1IG1vZGUuIEFpZWUhIFBsZWFzZSByZXBvcnQgdGhpcy5cbiIgKTsKCiAgICBpZihzdHlsZSAmIFdTX0lDT05JQykgcmV0dXJuOwoKICAgIGlmIChIQVNfVEhJQ0tGUkFNRSggc3R5bGUsIGV4U3R5bGUgKSkKICAgICAgICBJbmZsYXRlUmVjdCggcmVjdCwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSApOwogICAgZWxzZSBpZiAoSEFTX0RMR0ZSQU1FKCBzdHlsZSwgZXhTdHlsZSApKQogICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRExHRlJBTUUpICk7CiAgICBlbHNlIGlmIChIQVNfVEhJTkZSQU1FKCBzdHlsZSApKQogICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYQk9SREVSKSwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUJPUkRFUikpOwoKICAgIGlmICgoc3R5bGUgJiBXU19DQVBUSU9OKSA9PSBXU19DQVBUSU9OKQogICAgICAgIHJlY3QtPnRvcCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKTsKCiAgICBpZiAobWVudSkgcmVjdC0+dG9wIC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lNRU5VKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lCT1JERVIpOwoKICAgIGlmIChzdHlsZSAmIFdTX1ZTQ1JPTEwpIHsKICAgICAgcmVjdC0+cmlnaHQgICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hWU0NST0xMKSAtIDE7CiAgICAgIGlmKCFIQVNfQU5ZRlJBTUUoIHN0eWxlLCBleFN0eWxlICkpCgkgcmVjdC0+cmlnaHQrKzsKICAgIH0KCiAgICBpZiAoc3R5bGUgJiBXU19IU0NST0xMKSB7CiAgICAgIHJlY3QtPmJvdHRvbSArPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZSFNDUk9MTCkgLSAxOwogICAgICBpZighSEFTX0FOWUZSQU1FKCBzdHlsZSwgZXhTdHlsZSApKQoJIHJlY3QtPmJvdHRvbSsrOwogICAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOQ19BZGp1c3RSZWN0T3V0ZXI5NQogKgogKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgIm91dHNpZGUiIHBhcnRzIG9mIHRoZSB3aW5kb3cgYmFzZWQgb24gdGhlCiAqIHBhcmFtZXRlcnMgb2YgdGhlIGNsaWVudCBhcmVhLgogKgogKyBQQVJBTVMKICogICAgIExQUkVDVDE2ICByZWN0CiAqICAgICBEV09SRCAgc3R5bGUKICogICAgIEJPT0wgIG1lbnUKICogICAgIERXT1JEICBleFN0eWxlCiAqCiAqIE5PVEVTCiAqICAgICAiT3V0ZXIiIHBhcnRzIG9mIGEgd2luZG93IG1lYW5zIHRoZSB3aG9sZSB3aW5kb3cgZnJhbWUsIGNhcHRpb24gYW5kCiAqICAgICBtZW51IGJhci4gSXQgZG9lcyBub3QgaW5jbHVkZSAiaW5uZXIiIHBhcnRzIG9mIHRoZSBmcmFtZSBsaWtlIGNsaWVudAogKiAgICAgZWRnZSwgc3RhdGljIGVkZ2Ugb3Igc2Nyb2xsIGJhcnMuCiAqCiAqIFJldmlzaW9uIGhpc3RvcnkKICogICAgIDA1LUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogKiAgICAgICAgT3JpZ2luYWwgKE5DX0FkanVzdFJlY3Q5NSkgY3V0ICYgcGFzdGUgZnJvbSBOQ19BZGp1c3RSZWN0CiAqCiAqICAgICAyMC1KdW4tMTk5OCBFcmljIEtvaGwgKGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlKQogKiAgICAgICAgU3BsaXQgTkNfQWRqdXN0UmVjdDk1IGludG8gTkNfQWRqdXN0UmVjdE91dGVyOTUgYW5kCiAqICAgICAgICBOQ19BZGp1c3RSZWN0SW5uZXI5NSBhbmQgYWRkZWQgaGFuZGxpbmcgb2YgV2luOTUgc3R5bGVzLgogKgogKiAgICAgMjgtSnVsLTE5OTkgT3ZlIEvldmVuIChvdmVrQGFyY3RpY25ldC5ubykKICogICAgICAgIFN0cmVhbWxpbmVkIHdpbmRvdyBzdHlsZSBjaGVja3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCk5DX0FkanVzdFJlY3RPdXRlcjk1IChMUFJFQ1QgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wgbWVudSwgRFdPUkQgZXhTdHlsZSkKewogICAgaW50IGFkanVzdDsKICAgIGlmKHN0eWxlICYgV1NfSUNPTklDKSByZXR1cm47CgogICAgaWYgKChleFN0eWxlICYgKFdTX0VYX1NUQVRJQ0VER0V8V1NfRVhfRExHTU9EQUxGUkFNRSkpID09CiAgICAgICAgV1NfRVhfU1RBVElDRURHRSkKICAgIHsKICAgICAgICBhZGp1c3QgPSAxOyAvKiBmb3IgdGhlIG91dGVyIGZyYW1lIGFsd2F5cyBwcmVzZW50ICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYWRqdXN0ID0gMDsKICAgICAgICBpZiAoKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSB8fAogICAgICAgICAgICAoc3R5bGUgJiAoV1NfVEhJQ0tGUkFNRXxXU19ETEdGUkFNRSkpKSBhZGp1c3QgPSAyOyAvKiBvdXRlciAqLwogICAgfQogICAgaWYgKHN0eWxlICYgV1NfVEhJQ0tGUkFNRSkKICAgICAgICBhZGp1c3QgKz0gICggR2V0U3lzdGVtTWV0cmljcyAoU01fQ1hGUkFNRSkKICAgICAgICAgICAgICAgICAgIC0gR2V0U3lzdGVtTWV0cmljcyAoU01fQ1hETEdGUkFNRSkpOyAvKiBUaGUgcmVzaXplIGJvcmRlciAqLwogICAgaWYgKChzdHlsZSAmIChXU19CT1JERVJ8V1NfRExHRlJBTUUpKSB8fAogICAgICAgIChleFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkpCiAgICAgICAgYWRqdXN0Kys7IC8qIFRoZSBvdGhlciBib3JkZXIgKi8KCiAgICBJbmZsYXRlUmVjdCAocmVjdCwgYWRqdXN0LCBhZGp1c3QpOwoKICAgIGlmICgoc3R5bGUgJiBXU19DQVBUSU9OKSA9PSBXU19DQVBUSU9OKQogICAgewogICAgICAgIGlmIChleFN0eWxlICYgV1NfRVhfVE9PTFdJTkRPVykKICAgICAgICAgICAgcmVjdC0+dG9wIC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTTUNBUFRJT04pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmVjdC0+dG9wIC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKTsKICAgIH0KICAgIGlmIChtZW51KSByZWN0LT50b3AgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWU1FTlUpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOQ19BZGp1c3RSZWN0SW5uZXI5NQogKgogKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgImluc2lkZSIgcGFydCBvZiB0aGUgd2luZG93IGJhc2VkIG9uIHRoZQogKiBwYXJhbWV0ZXJzIG9mIHRoZSBjbGllbnQgYXJlYS4KICoKICsgUEFSQU1TCiAqICAgICBMUFJFQ1QxNiByZWN0CiAqICAgICBEV09SRCAgICBzdHlsZQogKiAgICAgRFdPUkQgICAgZXhTdHlsZQogKgogKiBOT1RFUwogKiAgICAgIklubmVyIiBwYXJ0IG9mIGEgd2luZG93IG1lYW5zIHRoZSB3aW5kb3cgZnJhbWUgaW5zaWRlIG9mIHRoZSBmbGF0CiAqICAgICB3aW5kb3cgZnJhbWUuIEl0IGluY2x1ZGVzIHRoZSBjbGllbnQgZWRnZSwgdGhlIHN0YXRpYyBlZGdlIGFuZCB0aGUKICogICAgIHNjcm9sbCBiYXJzLgogKgogKiBSZXZpc2lvbiBoaXN0b3J5CiAqICAgICAwNS1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICogICAgICAgIE9yaWdpbmFsIChOQ19BZGp1c3RSZWN0OTUpIGN1dCAmIHBhc3RlIGZyb20gTkNfQWRqdXN0UmVjdAogKgogKiAgICAgMjAtSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKICogICAgICAgIFNwbGl0IE5DX0FkanVzdFJlY3Q5NSBpbnRvIE5DX0FkanVzdFJlY3RPdXRlcjk1IGFuZAogKiAgICAgICAgTkNfQWRqdXN0UmVjdElubmVyOTUgYW5kIGFkZGVkIGhhbmRsaW5nIG9mIFdpbjk1IHN0eWxlcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQKTkNfQWRqdXN0UmVjdElubmVyOTUgKExQUkVDVCByZWN0LCBEV09SRCBzdHlsZSwgRFdPUkQgZXhTdHlsZSkKewogICAgaWYoc3R5bGUgJiBXU19JQ09OSUMpIHJldHVybjsKCiAgICBpZiAoZXhTdHlsZSAmIFdTX0VYX0NMSUVOVEVER0UpCiAgICAgICAgSW5mbGF0ZVJlY3QocmVjdCwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEVER0UpLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRURHRSkpOwoKICAgIGlmIChzdHlsZSAmIFdTX1ZTQ1JPTEwpIHJlY3QtPnJpZ2h0ICArPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCk7CiAgICBpZiAoc3R5bGUgJiBXU19IU0NST0xMKSByZWN0LT5ib3R0b20gKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOwp9CgoKCnN0YXRpYyBISUNPTiBOQ19JY29uRm9yV2luZG93KCBIV05EIGh3bmQgKQp7CiAgICBISUNPTiBoSWNvbiA9IChISUNPTikgR2V0Q2xhc3NMb25nQSggaHduZCwgR0NMX0hJQ09OU00gKTsKICAgIGlmICghaEljb24pIGhJY29uID0gKEhJQ09OKSBHZXRDbGFzc0xvbmdBKCBod25kLCBHQ0xfSElDT04gKTsKCiAgICAvKiBJZiB0aGVyZSBpcyBubyBoSWNvbiBzcGVjaWZpZWQgYW5kIHRoaXMgaXMgYSBtb2RhbCBkaWFsb2csCiAgICAgKiBnZXQgdGhlIGRlZmF1bHQgb25lLgogICAgICovCiAgICBpZiAoIWhJY29uICYmIChHZXRXaW5kb3dMb25nQSggaHduZCwgR1dMX1NUWUxFICkgJiBEU19NT0RBTEZSQU1FKSkKICAgICAgICBoSWNvbiA9IExvYWRJbWFnZUEoMCwgSURJX1dJTkxPR09BLCBJTUFHRV9JQ09OLCAwLCAwLCBMUl9ERUZBVUxUQ09MT1IpOwogICAgcmV0dXJuIGhJY29uOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCURyYXdDYXB0aW9uIChVU0VSMzIuQCkgRHJhd3MgYSBjYXB0aW9uIGJhcgogKgogKiBQQVJBTVMKICogICAgIGh3bmQgICBbSV0KICogICAgIGhkYyAgICBbSV0KICogICAgIGxwUmVjdCBbSV0KICogICAgIHVGbGFncyBbSV0KICoKICogUkVUVVJOUwogKiAgICAgU3VjY2VzczoKICogICAgIEZhaWx1cmU6CiAqLwoKQk9PTCBXSU5BUEkKRHJhd0NhcHRpb24gKEhXTkQgaHduZCwgSERDIGhkYywgY29uc3QgUkVDVCAqbHBSZWN0LCBVSU5UIHVGbGFncykKewogICAgcmV0dXJuIERyYXdDYXB0aW9uVGVtcEEgKGh3bmQsIGhkYywgbHBSZWN0LCAwLCAwLCBOVUxMLCB1RmxhZ3MgJiAweDFGKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRHJhd0NhcHRpb25UZW1wQSAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBEcmF3Q2FwdGlvblRlbXBBIChIV05EIGh3bmQsIEhEQyBoZGMsIGNvbnN0IFJFQ1QgKnJlY3QsIEhGT05UIGhGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISUNPTiBoSWNvbiwgTFBDU1RSIHN0ciwgVUlOVCB1RmxhZ3MpCnsKICAgIExQV1NUUiBzdHJXOwogICAgSU5UIGxlbjsKICAgIEJPT0wgcmV0ID0gRkFMU0U7CgogICAgaWYgKCEodUZsYWdzICYgRENfVEVYVCkgfHwgIXN0cikKICAgICAgICByZXR1cm4gRHJhd0NhcHRpb25UZW1wVyggaHduZCwgaGRjLCByZWN0LCBoRm9udCwgaEljb24sIE5VTEwsIHVGbGFncyApOwoKICAgIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgTlVMTCwgMCApOwogICAgaWYgKChzdHJXID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpICkpKQogICAgewogICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgc3RyVywgbGVuICk7CiAgICAgICAgcmV0ID0gRHJhd0NhcHRpb25UZW1wVyAoaHduZCwgaGRjLCByZWN0LCBoRm9udCwgaEljb24sIHN0clcsIHVGbGFncyk7CiAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwICgpLCAwLCBzdHJXICk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlEcmF3Q2FwdGlvblRlbXBXIChVU0VSMzIuQCkKICovCkJPT0wgV0lOQVBJIERyYXdDYXB0aW9uVGVtcFcgKEhXTkQgaHduZCwgSERDIGhkYywgY29uc3QgUkVDVCAqcmVjdCwgSEZPTlQgaEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OIGhJY29uLCBMUENXU1RSIHN0ciwgVUlOVCB1RmxhZ3MpCnsKICAgIFJFQ1QgICByYyA9ICpyZWN0OwoKICAgIFRSQUNFKCIoJTA4eCwlMDh4LCVwLCUwOHgsJTA4eCwlcywlMDh4KVxuIiwKICAgICAgICAgIGh3bmQsIGhkYywgcmVjdCwgaEZvbnQsIGhJY29uLCBkZWJ1Z3N0cl93KHN0ciksIHVGbGFncyk7CgogICAgLyogZHJhd2luZyBiYWNrZ3JvdW5kICovCiAgICBpZiAodUZsYWdzICYgRENfSU5CVVRUT04pIHsKCUZpbGxSZWN0IChoZGMsICZyYywgR2V0U3lzQ29sb3JCcnVzaCAoQ09MT1JfM0RGQUNFKSk7CgoJaWYgKHVGbGFncyAmIERDX0FDVElWRSkgewoJICAgIEhCUlVTSCBoYnIgPSBTZWxlY3RPYmplY3QgKGhkYywgQ0FDSEVfR2V0UGF0dGVybjU1QUFCcnVzaCAoKSk7CgkgICAgUGF0Qmx0IChoZGMsIHJjLmxlZnQsIHJjLnRvcCwKCQkgICAgICByYy5yaWdodC1yYy5sZWZ0LCByYy5ib3R0b20tcmMudG9wLCAweEZBMDA4OSk7CgkgICAgU2VsZWN0T2JqZWN0IChoZGMsIGhicik7Cgl9CiAgICB9CiAgICBlbHNlIHsKCUZpbGxSZWN0IChoZGMsICZyYywgR2V0U3lzQ29sb3JCcnVzaCAoKHVGbGFncyAmIERDX0FDVElWRSkgPwoJCSAgICBDT0xPUl9BQ1RJVkVDQVBUSU9OIDogQ09MT1JfSU5BQ1RJVkVDQVBUSU9OKSk7CiAgICB9CgoKICAgIC8qIGRyYXdpbmcgaWNvbiAqLwogICAgaWYgKCh1RmxhZ3MgJiBEQ19JQ09OKSAmJiAhKHVGbGFncyAmIERDX1NNQUxMQ0FQKSkgewoJUE9JTlQgcHQ7CgoJcHQueCA9IHJjLmxlZnQgKyAyOwoJcHQueSA9IChyYy5ib3R0b20gKyByYy50b3AgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU01JQ09OKSkgLyAyOwoKICAgICAgICBpZiAoIWhJY29uKSBoSWNvbiA9IE5DX0ljb25Gb3JXaW5kb3coaHduZCk7CiAgICAgICAgRHJhd0ljb25FeCAoaGRjLCBwdC54LCBwdC55LCBoSWNvbiwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNNSUNPTiksCiAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNNSUNPTiksIDAsIDAsIERJX05PUk1BTCk7CglyYy5sZWZ0ICs9IChyYy5ib3R0b20gLSByYy50b3ApOwogICAgfQoKICAgIC8qIGRyYXdpbmcgdGV4dCAqLwogICAgaWYgKHVGbGFncyAmIERDX1RFWFQpIHsKCUhGT05UIGhPbGRGb250OwoKCWlmICh1RmxhZ3MgJiBEQ19JTkJVVFRPTikKCSAgICBTZXRUZXh0Q29sb3IgKGhkYywgR2V0U3lzQ29sb3IgKENPTE9SX0JUTlRFWFQpKTsKCWVsc2UgaWYgKHVGbGFncyAmIERDX0FDVElWRSkKCSAgICBTZXRUZXh0Q29sb3IgKGhkYywgR2V0U3lzQ29sb3IgKENPTE9SX0NBUFRJT05URVhUKSk7CgllbHNlCgkgICAgU2V0VGV4dENvbG9yIChoZGMsIEdldFN5c0NvbG9yIChDT0xPUl9JTkFDVElWRUNBUFRJT05URVhUKSk7CgoJU2V0QmtNb2RlIChoZGMsIFRSQU5TUEFSRU5UKTsKCglpZiAoaEZvbnQpCgkgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QgKGhkYywgaEZvbnQpOwoJZWxzZSB7CgkgICAgTk9OQ0xJRU5UTUVUUklDU0EgbmNsbTsKCSAgICBIRk9OVCBoTmV3Rm9udDsKCSAgICBuY2xtLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTQSk7CgkgICAgU3lzdGVtUGFyYW1ldGVyc0luZm9BIChTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgMCwgJm5jbG0sIDApOwoJICAgIGhOZXdGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QSAoKHVGbGFncyAmIERDX1NNQUxMQ0FQKSA/CgkJJm5jbG0ubGZTbUNhcHRpb25Gb250IDogJm5jbG0ubGZDYXB0aW9uRm9udCk7CgkgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QgKGhkYywgaE5ld0ZvbnQpOwoJfQoKCWlmIChzdHIpCgkgICAgRHJhd1RleHRXIChoZGMsIHN0ciwgLTEsICZyYywKCQkJIERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSIHwgRFRfTk9QUkVGSVggfCBEVF9MRUZUKTsKCWVsc2UgewoJICAgIFdDSEFSIHN6VGV4dFsxMjhdOwoJICAgIElOVCBuTGVuOwoJICAgIG5MZW4gPSBHZXRXaW5kb3dUZXh0VyAoaHduZCwgc3pUZXh0LCAxMjgpOwoJICAgIERyYXdUZXh0VyAoaGRjLCBzelRleHQsIG5MZW4sICZyYywKCQkJIERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSIHwgRFRfTk9QUkVGSVggfCBEVF9MRUZUKTsKCX0KCglpZiAoaEZvbnQpCgkgICAgU2VsZWN0T2JqZWN0IChoZGMsIGhPbGRGb250KTsKCWVsc2UKCSAgICBEZWxldGVPYmplY3QgKFNlbGVjdE9iamVjdCAoaGRjLCBoT2xkRm9udCkpOwogICAgfQoKICAgIC8qIGRyYXdpbmcgZm9jdXMgPz8/ICovCiAgICBpZiAodUZsYWdzICYgMHgyMDAwKQoJRklYTUUoInVuZG9jdW1lbnRlZCBmbGFnICgweDIwMDApIVxuIik7CgogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFkanVzdFdpbmRvd1JlY3QgKFVTRVIuMTAyKQogKi8KQk9PTDE2IFdJTkFQSSBBZGp1c3RXaW5kb3dSZWN0MTYoIExQUkVDVDE2IHJlY3QsIERXT1JEIHN0eWxlLCBCT09MMTYgbWVudSApCnsKICAgIHJldHVybiBBZGp1c3RXaW5kb3dSZWN0RXgxNiggcmVjdCwgc3R5bGUsIG1lbnUsIDAgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWRqdXN0V2luZG93UmVjdCAoVVNFUjMyLkApCiAqLwpCT09MIFdJTkFQSSBBZGp1c3RXaW5kb3dSZWN0KCBMUFJFQ1QgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wgbWVudSApCnsKICAgIHJldHVybiBBZGp1c3RXaW5kb3dSZWN0RXgoIHJlY3QsIHN0eWxlLCBtZW51LCAwICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFkanVzdFdpbmRvd1JlY3RFeCAoVVNFUi40NTQpCiAqLwpCT09MMTYgV0lOQVBJIEFkanVzdFdpbmRvd1JlY3RFeDE2KCBMUFJFQ1QxNiByZWN0LCBEV09SRCBzdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDE2IG1lbnUsIERXT1JEIGV4U3R5bGUgKQp7CiAgICBSRUNUIHJlY3QzMjsKICAgIEJPT0wgcmV0OwoKICAgIENPTlZfUkVDVDE2VE8zMiggcmVjdCwgJnJlY3QzMiApOwogICAgcmV0ID0gQWRqdXN0V2luZG93UmVjdEV4KCAmcmVjdDMyLCBzdHlsZSwgbWVudSwgZXhTdHlsZSApOwogICAgQ09OVl9SRUNUMzJUTzE2KCAmcmVjdDMyLCByZWN0ICk7CiAgICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBZGp1c3RXaW5kb3dSZWN0RXggKFVTRVIzMi5AKQogKi8KQk9PTCBXSU5BUEkgQWRqdXN0V2luZG93UmVjdEV4KCBMUFJFQ1QgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wgbWVudSwgRFdPUkQgZXhTdHlsZSApCnsKICAgIC8qIENvcnJlY3QgdGhlIHdpbmRvdyBzdHlsZSAqLwogICAgc3R5bGUgJj0gKFdTX0RMR0ZSQU1FIHwgV1NfQk9SREVSIHwgV1NfVEhJQ0tGUkFNRSB8IFdTX0NISUxEKTsKICAgIGV4U3R5bGUgJj0gKFdTX0VYX0RMR01PREFMRlJBTUUgfCBXU19FWF9DTElFTlRFREdFIHwKICAgICAgICAgICAgICAgIFdTX0VYX1NUQVRJQ0VER0UgfCBXU19FWF9UT09MV0lORE9XKTsKICAgIGlmIChleFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkgc3R5bGUgJj0gfldTX1RISUNLRlJBTUU7CgogICAgVFJBQ0UoIiglZCwlZCktKCVkLCVkKSAlMDhseCAlZCAlMDhseFxuIiwKICAgICAgICAgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSwKICAgICAgICAgIHN0eWxlLCBtZW51LCBleFN0eWxlICk7CgogICAgaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCiAgICAgICAgTkNfQWRqdXN0UmVjdCggcmVjdCwgc3R5bGUsIG1lbnUsIGV4U3R5bGUgKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBOQ19BZGp1c3RSZWN0T3V0ZXI5NSggcmVjdCwgc3R5bGUsIG1lbnUsIGV4U3R5bGUgKTsKICAgICAgICBOQ19BZGp1c3RSZWN0SW5uZXI5NSggcmVjdCwgc3R5bGUsIGV4U3R5bGUgKTsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOQ19IYW5kbGVOQ0NhbGNTaXplCiAqCiAqIEhhbmRsZSBhIFdNX05DQ0FMQ1NJWkUgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogKi8KTE9ORyBOQ19IYW5kbGVOQ0NhbGNTaXplKCBIV05EIGh3bmQsIFJFQ1QgKndpblJlY3QgKQp7CiAgICBSRUNUIHRtcFJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKICAgIExPTkcgcmVzdWx0ID0gMDsKICAgIExPTkcgY2xzX3N0eWxlID0gR2V0Q2xhc3NMb25nQShod25kLCBHQ0xfU1RZTEUpOwogICAgTE9ORyBzdHlsZSA9IEdldFdpbmRvd0xvbmdBKCBod25kLCBHV0xfU1RZTEUgKTsKICAgIExPTkcgZXhTdHlsZSA9IEdldFdpbmRvd0xvbmdBKCBod25kLCBHV0xfRVhTVFlMRSApOwoKICAgIGlmIChjbHNfc3R5bGUgJiBDU19WUkVEUkFXKSByZXN1bHQgfD0gV1ZSX1ZSRURSQVc7CiAgICBpZiAoY2xzX3N0eWxlICYgQ1NfSFJFRFJBVykgcmVzdWx0IHw9IFdWUl9IUkVEUkFXOwoKICAgIGlmICghSXNJY29uaWMoaHduZCkpCiAgICB7CglpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKCSAgICBOQ19BZGp1c3RSZWN0KCAmdG1wUmVjdCwgc3R5bGUsIEZBTFNFLCBleFN0eWxlICk7CgllbHNlCgkgICAgTkNfQWRqdXN0UmVjdE91dGVyOTUoICZ0bXBSZWN0LCBzdHlsZSwgRkFMU0UsIGV4U3R5bGUgKTsKCgl3aW5SZWN0LT5sZWZ0ICAgLT0gdG1wUmVjdC5sZWZ0OwoJd2luUmVjdC0+dG9wICAgIC09IHRtcFJlY3QudG9wOwoJd2luUmVjdC0+cmlnaHQgIC09IHRtcFJlY3QucmlnaHQ7Cgl3aW5SZWN0LT5ib3R0b20gLT0gdG1wUmVjdC5ib3R0b207CgogICAgICAgIGlmICghKHN0eWxlICYgV1NfQ0hJTEQpICYmIEdldE1lbnUoaHduZCkpCiAgICAgICAgewoJICAgIFRSQUNFKCJDYWxsaW5nIEdldE1lbnVCYXJIZWlnaHQgd2l0aCBIV05EIDB4JXgsIHdpZHRoICVkLCAiCiAgICAgICAgICAgICAgICAgICJhdCAoJWQsICVkKS5cbiIsIGh3bmQsCiAgICAgICAgICAgICAgICAgIHdpblJlY3QtPnJpZ2h0IC0gd2luUmVjdC0+bGVmdCwKICAgICAgICAgICAgICAgICAgLXRtcFJlY3QubGVmdCwgLXRtcFJlY3QudG9wICk7CgoJICAgIHdpblJlY3QtPnRvcCArPQoJCU1FTlVfR2V0TWVudUJhckhlaWdodCggaHduZCwKCQkJCSAgICAgICB3aW5SZWN0LT5yaWdodCAtIHdpblJlY3QtPmxlZnQsCgkJCQkgICAgICAgLXRtcFJlY3QubGVmdCwgLXRtcFJlY3QudG9wICkgKyAxOwoJfQoKCWlmIChUV0VBS19XaW5lTG9vayA+IFdJTjMxX0xPT0spIHsKCSAgICBTZXRSZWN0KCZ0bXBSZWN0LCAwLCAwLCAwLCAwKTsKCSAgICBOQ19BZGp1c3RSZWN0SW5uZXI5NSAoJnRtcFJlY3QsIHN0eWxlLCBleFN0eWxlKTsKCSAgICB3aW5SZWN0LT5sZWZ0ICAgLT0gdG1wUmVjdC5sZWZ0OwoJICAgIHdpblJlY3QtPnRvcCAgICAtPSB0bXBSZWN0LnRvcDsKCSAgICB3aW5SZWN0LT5yaWdodCAgLT0gdG1wUmVjdC5yaWdodDsKCSAgICB3aW5SZWN0LT5ib3R0b20gLT0gdG1wUmVjdC5ib3R0b207Cgl9CgogICAgICAgIGlmICh3aW5SZWN0LT50b3AgPiB3aW5SZWN0LT5ib3R0b20pCiAgICAgICAgICAgIHdpblJlY3QtPmJvdHRvbSA9IHdpblJlY3QtPnRvcDsKCiAgICAgICAgaWYgKHdpblJlY3QtPmxlZnQgPiB3aW5SZWN0LT5yaWdodCkKICAgICAgICAgICAgd2luUmVjdC0+cmlnaHQgPSB3aW5SZWN0LT5sZWZ0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfR2V0SW5zaWRlUmVjdAogKgogKiBHZXQgdGhlICdpbnNpZGUnIHJlY3RhbmdsZSBvZiBhIHdpbmRvdywgaS5lLiB0aGUgd2hvbGUgd2luZG93IHJlY3RhbmdsZQogKiBidXQgd2l0aG91dCB0aGUgYm9yZGVycyAoaWYgYW55KS4KICogVGhlIHJlY3RhbmdsZSBpcyBpbiB3aW5kb3cgY29vcmRpbmF0ZXMgKGZvciBkcmF3aW5nIHdpdGggR2V0V2luZG93REMoKSkuCiAqLwp2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQgaHduZCwgUkVDVCAqcmVjdCApCnsKICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CgogICAgcmVjdC0+dG9wICAgID0gcmVjdC0+bGVmdCA9IDA7CiAgICByZWN0LT5yaWdodCAgPSB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKICAgIHJlY3QtPmJvdHRvbSA9IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwoKICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19JQ09OSUMpIGdvdG8gRU5EOwoKICAgIC8qIFJlbW92ZSBmcmFtZSBmcm9tIHJlY3RhbmdsZSAqLwogICAgaWYgKEhBU19USElDS0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUsIHduZFB0ci0+ZHdFeFN0eWxlICkpCiAgICB7CiAgICAgICAgSW5mbGF0ZVJlY3QoIHJlY3QsIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlJBTUUpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSApOwogICAgfQogICAgZWxzZSBpZiAoSEFTX0RMR0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUsIHduZFB0ci0+ZHdFeFN0eWxlICkpCiAgICB7CiAgICAgICAgSW5mbGF0ZVJlY3QoIHJlY3QsIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWURMR0ZSQU1FKSk7CiAgICAgICAgLyogRklYTUU6IHRoaXMgaXNuJ3QgaW4gTkNfQWRqdXN0UmVjdD8gd2h5IG5vdD8gKi8KICAgICAgICBpZiAoKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spICYmICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKQogICAgICAgICAgICBJbmZsYXRlUmVjdCggcmVjdCwgLTEsIDAgKTsKICAgIH0KICAgIGVsc2UgaWYgKEhBU19USElORlJBTUUoIHduZFB0ci0+ZHdTdHlsZSApKQogICAgewogICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUiksIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSApOwogICAgfQoKICAgIC8qIFdlIGhhdmUgYWRkaXRpb25hbCBib3JkZXIgaW5mb3JtYXRpb24gaWYgdGhlIHdpbmRvdwogICAgICogaXMgYSBjaGlsZCAoYnV0IG5vdCBhbiBNREkgY2hpbGQpICovCiAgICBpZiAoVFdFQUtfV2luZUxvb2sgIT0gV0lOMzFfTE9PSykKICAgIHsKICAgICAgICBpZiAoICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgICYmCiAgICAgICAgICAgICAoICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX01ESUNISUxEKSA9PSAwICkgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfQ0xJRU5URURHRSkKICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0IChyZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWEVER0UpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWUVER0UpKTsKICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfU1RBVElDRURHRSkKICAgICAgICAgICAgICAgIEluZmxhdGVSZWN0IChyZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUiksIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSk7CiAgICAgICAgfQogICAgfQoKRU5EOgogICAgV0lOX1JlbGVhc2VXbmRQdHIod25kUHRyKTsKICAgIHJldHVybjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOQ19Eb05DSGl0VGVzdAogKgogKiBIYW5kbGUgYSBXTV9OQ0hJVFRFU1QgbWVzc2FnZS4gQ2FsbGVkIGZyb20gTkNfSGFuZGxlTkNIaXRUZXN0KCkuCiAqLwoKc3RhdGljIExPTkcgTkNfRG9OQ0hpdFRlc3QgKFdORCAqd25kUHRyLCBQT0lOVCBwdCApCnsKICAgIFJFQ1QgcmVjdDsKCiAgICBUUkFDRSgiaHduZD0lMDR4IHB0PSVsZCwlbGRcbiIsIHduZFB0ci0+aHduZFNlbGYsIHB0LngsIHB0LnkgKTsKCiAgICBHZXRXaW5kb3dSZWN0KHduZFB0ci0+aHduZFNlbGYsICZyZWN0ICk7CiAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUTk9XSEVSRTsKCiAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIHJldHVybiBIVENBUFRJT047CgogICAgLyogQ2hlY2sgYm9yZGVycyAqLwogICAgaWYgKEhBU19USElDS0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUsIHduZFB0ci0+ZHdFeFN0eWxlICkpCiAgICB7CiAgICAgICAgSW5mbGF0ZVJlY3QoICZyZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSwgLUdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSkgKTsKICAgICAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIENoZWNrIHRvcCBzaXppbmcgYm9yZGVyICovCiAgICAgICAgICAgIGlmIChwdC55IDwgcmVjdC50b3ApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwdC54IDwgcmVjdC5sZWZ0K0dldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKSkgcmV0dXJuIEhUVE9QTEVGVDsKICAgICAgICAgICAgICAgIGlmIChwdC54ID49IHJlY3QucmlnaHQtR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpKSByZXR1cm4gSFRUT1BSSUdIVDsKICAgICAgICAgICAgICAgIHJldHVybiBIVFRPUDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBDaGVjayBib3R0b20gc2l6aW5nIGJvcmRlciAqLwogICAgICAgICAgICBpZiAocHQueSA+PSByZWN0LmJvdHRvbSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHB0LnggPCByZWN0LmxlZnQrR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpKSByZXR1cm4gSFRCT1RUT01MRUZUOwogICAgICAgICAgICAgICAgaWYgKHB0LnggPj0gcmVjdC5yaWdodC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkpIHJldHVybiBIVEJPVFRPTVJJR0hUOwogICAgICAgICAgICAgICAgcmV0dXJuIEhUQk9UVE9NOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENoZWNrIGxlZnQgc2l6aW5nIGJvcmRlciAqLwogICAgICAgICAgICBpZiAocHQueCA8IHJlY3QubGVmdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHB0LnkgPCByZWN0LnRvcCtHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkpIHJldHVybiBIVFRPUExFRlQ7CiAgICAgICAgICAgICAgICBpZiAocHQueSA+PSByZWN0LmJvdHRvbS1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkpIHJldHVybiBIVEJPVFRPTUxFRlQ7CiAgICAgICAgICAgICAgICByZXR1cm4gSFRMRUZUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENoZWNrIHJpZ2h0IHNpemluZyBib3JkZXIgKi8KICAgICAgICAgICAgaWYgKHB0LnggPj0gcmVjdC5yaWdodCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHB0LnkgPCByZWN0LnRvcCtHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkpIHJldHVybiBIVFRPUFJJR0hUOwogICAgICAgICAgICAgICAgaWYgKHB0LnkgPj0gcmVjdC5ib3R0b20tR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpKSByZXR1cm4gSFRCT1RUT01SSUdIVDsKICAgICAgICAgICAgICAgIHJldHVybiBIVFJJR0hUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSAgLyogTm8gdGhpY2sgZnJhbWUgKi8KICAgIHsKICAgICAgICBpZiAoSEFTX0RMR0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUsIHduZFB0ci0+ZHdFeFN0eWxlICkpCiAgICAgICAgICAgIEluZmxhdGVSZWN0KCZyZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKSwgLUdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSkpOwogICAgICAgIGVsc2UgaWYgKEhBU19USElORlJBTUUoIHduZFB0ci0+ZHdTdHlsZSApKQogICAgICAgICAgICBJbmZsYXRlUmVjdCgmcmVjdCwgLUdldFN5c3RlbU1ldHJpY3MoU01fQ1hCT1JERVIpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWUJPUkRFUikpOwogICAgICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gSFRCT1JERVI7CiAgICB9CgogICAgLyogQ2hlY2sgY2FwdGlvbiAqLwoKICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfQ0FQVElPTikgPT0gV1NfQ0FQVElPTikKICAgIHsKICAgICAgICByZWN0LnRvcCArPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKTsKICAgICAgICBpZiAoIVB0SW5SZWN0KCAmcmVjdCwgcHQgKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIENoZWNrIHN5c3RlbSBtZW51ICovCiAgICAgICAgICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfU1lTTUVOVSkgJiYgISh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX1RPT0xXSU5ET1cpKQogICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKTsKICAgICAgICAgICAgaWYgKHB0LnggPD0gcmVjdC5sZWZ0KSByZXR1cm4gSFRTWVNNRU5VOwoKICAgICAgICAgICAgLyogQ2hlY2sgbWF4aW1pemUgYm94ICovCiAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRUJPWCkKICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpICsgMTsKCiAgICAgICAgICAgIGlmIChwdC54ID49IHJlY3QucmlnaHQpIHJldHVybiBIVE1BWEJVVFRPTjsKICAgICAgICAgICAgLyogQ2hlY2sgbWluaW1pemUgYm94ICovCiAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRUJPWCkKICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpICsgMTsKICAgICAgICAgICAgaWYgKHB0LnggPj0gcmVjdC5yaWdodCkgcmV0dXJuIEhUTUlOQlVUVE9OOwogICAgICAgICAgICByZXR1cm4gSFRDQVBUSU9OOwogICAgICAgIH0KICAgIH0KCiAgICAgIC8qIENoZWNrIGNsaWVudCBhcmVhICovCgogICAgU2NyZWVuVG9DbGllbnQoIHduZFB0ci0+aHduZFNlbGYsICZwdCApOwogICAgR2V0Q2xpZW50UmVjdCggd25kUHRyLT5od25kU2VsZiwgJnJlY3QgKTsKICAgIGlmIChQdEluUmVjdCggJnJlY3QsIHB0ICkpIHJldHVybiBIVENMSUVOVDsKCiAgICAgIC8qIENoZWNrIHZlcnRpY2FsIHNjcm9sbCBiYXIgKi8KCiAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkKICAgIHsKCXJlY3QucmlnaHQgKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOwoJaWYgKFB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUVlNDUk9MTDsKICAgIH0KCiAgICAgIC8qIENoZWNrIGhvcml6b250YWwgc2Nyb2xsIGJhciAqLwoKICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19IU0NST0xMKQogICAgewoJcmVjdC5ib3R0b20gKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOwoJaWYgKFB0SW5SZWN0KCAmcmVjdCwgcHQgKSkKCXsKCSAgICAgIC8qIENoZWNrIHNpemUgYm94ICovCgkgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19WU0NST0xMKSAmJgoJCShwdC54ID49IHJlY3QucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCkpKQoJCXJldHVybiBIVFNJWkU7CgkgICAgcmV0dXJuIEhUSFNDUk9MTDsKCX0KICAgIH0KCiAgICAgIC8qIENoZWNrIG1lbnUgYmFyICovCgogICAgaWYgKEhBU19NRU5VKHduZFB0cikpCiAgICB7CglpZiAoKHB0LnkgPCAwKSAmJiAocHQueCA+PSAwKSAmJiAocHQueCA8IHJlY3QucmlnaHQpKQoJICAgIHJldHVybiBIVE1FTlU7CiAgICB9CgogICAgLyogSGFzIHRvIHJldHVybiBIVE5PV0hFUkUgaWYgbm90aGluZyB3YXMgZm91bmQKICAgICAgIENvdWxkIGhhcHBlbiB3aGVuIGEgd2luZG93IGhhcyBhIGN1c3RvbWl6ZWQgbm9uIGNsaWVudCBhcmVhICovCiAgICByZXR1cm4gSFROT1dIRVJFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5DX0RvTkNIaXRUZXN0OTUKICoKICogSGFuZGxlIGEgV01fTkNISVRURVNUIG1lc3NhZ2UuIENhbGxlZCBmcm9tIE5DX0hhbmRsZU5DSGl0VGVzdCgpLgogKgogKiBGSVhNRTogIEp1c3QgYSBtb2RpZmllZCBjb3B5IG9mIHRoZSBXaW4gMy4xIHZlcnNpb24uCiAqLwoKc3RhdGljIExPTkcgTkNfRG9OQ0hpdFRlc3Q5NSAoV05EICp3bmRQdHIsIFBPSU5UIHB0ICkKewogICAgUkVDVCByZWN0OwoKICAgIFRSQUNFKCJod25kPSUwNHggcHQ9JWxkLCVsZFxuIiwgd25kUHRyLT5od25kU2VsZiwgcHQueCwgcHQueSApOwoKICAgIEdldFdpbmRvd1JlY3Qod25kUHRyLT5od25kU2VsZiwgJnJlY3QgKTsKICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gSFROT1dIRVJFOwoKICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkgcmV0dXJuIEhUQ0FQVElPTjsKCiAgICAvKiBDaGVjayBib3JkZXJzICovCiAgICBpZiAoSEFTX1RISUNLRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKICAgIHsKICAgICAgICBJbmZsYXRlUmVjdCggJnJlY3QsIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlJBTUUpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSApOwogICAgICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKQogICAgICAgIHsKICAgICAgICAgICAgLyogQ2hlY2sgdG9wIHNpemluZyBib3JkZXIgKi8KICAgICAgICAgICAgaWYgKHB0LnkgPCByZWN0LnRvcCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHB0LnggPCByZWN0LmxlZnQrR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpKSByZXR1cm4gSFRUT1BMRUZUOwogICAgICAgICAgICAgICAgaWYgKHB0LnggPj0gcmVjdC5yaWdodC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkpIHJldHVybiBIVFRPUFJJR0hUOwogICAgICAgICAgICAgICAgcmV0dXJuIEhUVE9QOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENoZWNrIGJvdHRvbSBzaXppbmcgYm9yZGVyICovCiAgICAgICAgICAgIGlmIChwdC55ID49IHJlY3QuYm90dG9tKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocHQueCA8IHJlY3QubGVmdCtHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkpIHJldHVybiBIVEJPVFRPTUxFRlQ7CiAgICAgICAgICAgICAgICBpZiAocHQueCA+PSByZWN0LnJpZ2h0LUdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKSkgcmV0dXJuIEhUQk9UVE9NUklHSFQ7CiAgICAgICAgICAgICAgICByZXR1cm4gSFRCT1RUT007CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogQ2hlY2sgbGVmdCBzaXppbmcgYm9yZGVyICovCiAgICAgICAgICAgIGlmIChwdC54IDwgcmVjdC5sZWZ0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocHQueSA8IHJlY3QudG9wK0dldFN5c3RlbU1ldHJpY3MoU01fQ1lTSVpFKSkgcmV0dXJuIEhUVE9QTEVGVDsKICAgICAgICAgICAgICAgIGlmIChwdC55ID49IHJlY3QuYm90dG9tLUdldFN5c3RlbU1ldHJpY3MoU01fQ1lTSVpFKSkgcmV0dXJuIEhUQk9UVE9NTEVGVDsKICAgICAgICAgICAgICAgIHJldHVybiBIVExFRlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogQ2hlY2sgcmlnaHQgc2l6aW5nIGJvcmRlciAqLwogICAgICAgICAgICBpZiAocHQueCA+PSByZWN0LnJpZ2h0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAocHQueSA8IHJlY3QudG9wK0dldFN5c3RlbU1ldHJpY3MoU01fQ1lTSVpFKSkgcmV0dXJuIEhUVE9QUklHSFQ7CiAgICAgICAgICAgICAgICBpZiAocHQueSA+PSByZWN0LmJvdHRvbS1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkpIHJldHVybiBIVEJPVFRPTVJJR0hUOwogICAgICAgICAgICAgICAgcmV0dXJuIEhUUklHSFQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlICAvKiBObyB0aGljayBmcmFtZSAqLwogICAgewogICAgICAgIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKICAgICAgICAgICAgSW5mbGF0ZVJlY3QoJnJlY3QsIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpLCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWURMR0ZSQU1FKSk7CiAgICAgICAgZWxzZSBpZiAoSEFTX1RISU5GUkFNRSggd25kUHRyLT5kd1N0eWxlICkpCiAgICAgICAgICAgIEluZmxhdGVSZWN0KCZyZWN0LCAtR2V0U3lzdGVtTWV0cmljcyhTTV9DWEJPUkRFUiksIC1HZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQk9SREVSKSk7CiAgICAgICAgaWYgKCFQdEluUmVjdCggJnJlY3QsIHB0ICkpIHJldHVybiBIVEJPUkRFUjsKICAgIH0KCiAgICAvKiBDaGVjayBjYXB0aW9uICovCgogICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19DQVBUSU9OKSA9PSBXU19DQVBUSU9OKQogICAgewogICAgICAgIGlmICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX1RPT0xXSU5ET1cpCiAgICAgICAgICAgIHJlY3QudG9wICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTTUNBUFRJT04pIC0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlY3QudG9wICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSAtIDE7CiAgICAgICAgaWYgKCFQdEluUmVjdCggJnJlY3QsIHB0ICkpCiAgICAgICAgewogICAgICAgICAgICAvKiBDaGVjayBzeXN0ZW0gbWVudSAqLwogICAgICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICYmICEod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9UT09MV0lORE9XKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKE5DX0ljb25Gb3JXaW5kb3cod25kUHRyLT5od25kU2VsZikpCiAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHB0LnggPCByZWN0LmxlZnQpIHJldHVybiBIVFNZU01FTlU7CgogICAgICAgICAgICAvKiBDaGVjayBjbG9zZSBidXR0b24gKi8KICAgICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpCiAgICAgICAgICAgICAgICByZWN0LnJpZ2h0IC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSAtIDE7CiAgICAgICAgICAgIGlmIChwdC54ID4gcmVjdC5yaWdodCkgcmV0dXJuIEhUQ0xPU0U7CgogICAgICAgICAgICAvKiBDaGVjayBtYXhpbWl6ZSBib3ggKi8KICAgICAgICAgICAgLyogSW4gd2luOTUgdGhlcmUgaXMgYXV0b21hdGljYWxseSBhIE1heGltaXplIGJ1dHRvbiB3aGVuIHRoZXJlIGlzIGEgbWluaW1pemUgb25lKi8KICAgICAgICAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRUJPWCl8fCAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkVCT1gpKQogICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwogICAgICAgICAgICBpZiAocHQueCA+IHJlY3QucmlnaHQpIHJldHVybiBIVE1BWEJVVFRPTjsKCiAgICAgICAgICAgIC8qIENoZWNrIG1pbmltaXplIGJveCAqLwogICAgICAgICAgICAvKiBJbiB3aW45NSB0aGVyZSBpcyBhdXRvbWF0aWNhbGx5IGEgTWF4aW1pemUgYnV0dG9uIHdoZW4gdGhlcmUgaXMgYSBNYXhpbWl6ZSBvbmUqLwogICAgICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFQk9YKXx8KHduZFB0ci0+ZHdTdHlsZSAmIFdTX01BWElNSVpFQk9YKSkKICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpICsgMTsKCiAgICAgICAgICAgIGlmIChwdC54ID4gcmVjdC5yaWdodCkgcmV0dXJuIEhUTUlOQlVUVE9OOwogICAgICAgICAgICByZXR1cm4gSFRDQVBUSU9OOwogICAgICAgIH0KICAgIH0KCiAgICAgIC8qIENoZWNrIGNsaWVudCBhcmVhICovCgogICAgU2NyZWVuVG9DbGllbnQoIHduZFB0ci0+aHduZFNlbGYsICZwdCApOwogICAgR2V0Q2xpZW50UmVjdCggd25kUHRyLT5od25kU2VsZiwgJnJlY3QgKTsKICAgIGlmIChQdEluUmVjdCggJnJlY3QsIHB0ICkpIHJldHVybiBIVENMSUVOVDsKCiAgICAgIC8qIENoZWNrIHZlcnRpY2FsIHNjcm9sbCBiYXIgKi8KCiAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkKICAgIHsKCXJlY3QucmlnaHQgKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOwoJaWYgKFB0SW5SZWN0KCAmcmVjdCwgcHQgKSkgcmV0dXJuIEhUVlNDUk9MTDsKICAgIH0KCiAgICAgIC8qIENoZWNrIGhvcml6b250YWwgc2Nyb2xsIGJhciAqLwoKICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19IU0NST0xMKQogICAgewoJcmVjdC5ib3R0b20gKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpOwoJaWYgKFB0SW5SZWN0KCAmcmVjdCwgcHQgKSkKCXsKCSAgICAgIC8qIENoZWNrIHNpemUgYm94ICovCgkgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19WU0NST0xMKSAmJgoJCShwdC54ID49IHJlY3QucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCkpKQoJCXJldHVybiBIVFNJWkU7CgkgICAgcmV0dXJuIEhUSFNDUk9MTDsKCX0KICAgIH0KCiAgICAgIC8qIENoZWNrIG1lbnUgYmFyICovCgogICAgaWYgKEhBU19NRU5VKHduZFB0cikpCiAgICB7CglpZiAoKHB0LnkgPCAwKSAmJiAocHQueCA+PSAwKSAmJiAocHQueCA8IHJlY3QucmlnaHQpKQoJICAgIHJldHVybiBIVE1FTlU7CiAgICB9CgogICAgLyogSGFzIHRvIHJldHVybiBIVE5PV0hFUkUgaWYgbm90aGluZyB3YXMgZm91bmQKICAgICAgIENvdWxkIGhhcHBlbiB3aGVuIGEgd2luZG93IGhhcyBhIGN1c3RvbWl6ZWQgbm9uIGNsaWVudCBhcmVhICovCiAgICByZXR1cm4gSFROT1dIRVJFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5DX0hhbmRsZU5DSGl0VGVzdAogKgogKiBIYW5kbGUgYSBXTV9OQ0hJVFRFU1QgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogKi8KTE9ORyBOQ19IYW5kbGVOQ0hpdFRlc3QgKEhXTkQgaHduZCAsIFBPSU5UIHB0KQp7CiAgICBMT05HIHJldHZhbHVlOwogICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciAoaHduZCk7CgogICAgaWYgKCF3bmRQdHIpCglyZXR1cm4gSFRFUlJPUjsKCiAgICBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKICAgICAgICByZXR2YWx1ZSA9IE5DX0RvTkNIaXRUZXN0ICh3bmRQdHIsIHB0KTsKICAgIGVsc2UKICAgICAgICByZXR2YWx1ZSA9IE5DX0RvTkNIaXRUZXN0OTUgKHduZFB0ciwgcHQpOwogICAgV0lOX1JlbGVhc2VXbmRQdHIod25kUHRyKTsKICAgIHJldHVybiByZXR2YWx1ZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfRHJhd1N5c0J1dHRvbgogKi8Kdm9pZCBOQ19EcmF3U3lzQnV0dG9uKCBIV05EIGh3bmQsIEhEQyBoZGMsIEJPT0wgZG93biApCnsKICAgIFJFQ1QgcmVjdDsKICAgIEhEQyBoZGNNZW07CiAgICBIQklUTUFQIGhiaXRtYXA7CgogICAgTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKICAgIGhkY01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQyggaGRjICk7CiAgICBoYml0bWFwID0gU2VsZWN0T2JqZWN0KCBoZGNNZW0sIGhiaXRtYXBDbG9zZSApOwogICAgQml0Qmx0KGhkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpLCBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSksCiAgICAgICAgICAgaGRjTWVtLCAoR2V0V2luZG93TG9uZ0EoaHduZCxHV0xfU1RZTEUpICYgV1NfQ0hJTEQpID8gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpIDogMCwgMCwKICAgICAgICAgICBkb3duID8gTk9UU1JDQ09QWSA6IFNSQ0NPUFkgKTsKICAgIFNlbGVjdE9iamVjdCggaGRjTWVtLCBoYml0bWFwICk7CiAgICBEZWxldGVEQyggaGRjTWVtICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5DX0RyYXdNYXhCdXR0b24KICovCnN0YXRpYyB2b2lkIE5DX0RyYXdNYXhCdXR0b24oIEhXTkQgaHduZCwgSERDMTYgaGRjLCBCT09MIGRvd24gKQp7CiAgICBSRUNUIHJlY3Q7CiAgICBVSU5UIGZsYWdzID0gSXNab29tZWQoaHduZCkgPyBERkNTX0NBUFRJT05SRVNUT1JFIDogREZDU19DQVBUSU9OTUFYOwoKICAgIE5DX0dldEluc2lkZVJlY3QoIGh3bmQsICZyZWN0ICk7CiAgICByZWN0LmxlZnQgPSByZWN0LnJpZ2h0IC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpICsgMTsKICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkgLSAxOwogICAgcmVjdC50b3AgKz0gMTsKICAgIHJlY3QucmlnaHQgLT0gMTsKICAgIGlmIChkb3duKSBmbGFncyB8PSBERkNTX1BVU0hFRDsKICAgIERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QsIERGQ19DQVBUSU9OLCBmbGFncyApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOQ19EcmF3TWluQnV0dG9uCiAqLwpzdGF0aWMgdm9pZCBOQ19EcmF3TWluQnV0dG9uKCBIV05EIGh3bmQsIEhEQzE2IGhkYywgQk9PTCBkb3duICkKewogICAgUkVDVCByZWN0OwogICAgVUlOVCBmbGFncyA9IERGQ1NfQ0FQVElPTk1JTjsKICAgIERXT1JEIHN0eWxlID0gR2V0V2luZG93TG9uZ0EoIGh3bmQsIEdXTF9TVFlMRSApOwoKICAgIE5DX0dldEluc2lkZVJlY3QoIGh3bmQsICZyZWN0ICk7CiAgICBpZiAoc3R5bGUgJiAoV1NfTUFYSU1JWkVCT1h8V1NfTUlOSU1JWkVCT1gpKQogICAgICAgIHJlY3QucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpIC0gMjsKICAgIHJlY3QubGVmdCA9IHJlY3QucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwogICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTSVpFKSAtIDE7CiAgICByZWN0LnRvcCArPSAxOwogICAgcmVjdC5yaWdodCAtPSAxOwogICAgaWYgKGRvd24pIGZsYWdzIHw9IERGQ1NfUFVTSEVEOwogICAgRHJhd0ZyYW1lQ29udHJvbCggaGRjLCAmcmVjdCwgREZDX0NBUFRJT04sIGZsYWdzICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgdm9pZCAgTkNfRHJhd1N5c0J1dHRvbjk1KAogKiAgICAgIEhXTkQgIGh3bmQsCiAqICAgICAgSERDICBoZGMsCiAqICAgICAgQk9PTCAgZG93biApCiAqCiAqICAgRHJhd3MgdGhlIFdpbjk1IHN5c3RlbSBpY29uLgogKgogKiAgIFJldmlzaW9uIGhpc3RvcnkKICogICAgICAgIDA1LUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogKiAgICAgICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBmcm9tIE5DX0RyYXdTeXNCdXR0b24gc291cmNlLgogKiAgICAgICAgMTEtSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKICogICAgICAgICAgICAgRml4ZWQgbW9zdCBidWdzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpCT09MCk5DX0RyYXdTeXNCdXR0b245NSAoSFdORCBod25kLCBIREMgaGRjLCBCT09MIGRvd24pCnsKICAgIEhJQ09OIGhJY29uID0gTkNfSWNvbkZvcldpbmRvdyggaHduZCApOwoKICAgIGlmIChoSWNvbikKICAgIHsKICAgICAgICBSRUNUIHJlY3Q7CiAgICAgICAgTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKICAgICAgICBEcmF3SWNvbkV4IChoZGMsIHJlY3QubGVmdCArIDEsIHJlY3QudG9wICsgMSwgaEljb24sCiAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpIC0gMSwKICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkgLSAxLCAwLCAwLCBESV9OT1JNQUwpOwogICAgfQogICAgcmV0dXJuIChoSWNvbiAhPSAwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICB2b2lkICBOQ19EcmF3Q2xvc2VCdXR0b245NSgKICogICAgICBIV05EICBod25kLAogKiAgICAgIEhEQyAgaGRjLAogKiAgICAgIEJPT0wgIGRvd24sCiAqICAgICAgQk9PTCAgICBiR3JheWVkICkKICoKICogICBEcmF3cyB0aGUgV2luOTUgY2xvc2UgYnV0dG9uLgogKgogKiAgIElmIGJHcmF5ZWQgaXMgdHJ1ZSwgdGhlbiBkcmF3IGEgZGlzYWJsZWQgQ2xvc2UgYnV0dG9uCiAqCiAqICAgUmV2aXNpb24gaGlzdG9yeQogKiAgICAgICAgMTEtSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZnJvbSBOQ19EcmF3U3lzQnV0dG9uOTUgc291cmNlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBOQ19EcmF3Q2xvc2VCdXR0b245NSAoSFdORCBod25kLCBIREMgaGRjLCBCT09MIGRvd24sIEJPT0wgYkdyYXllZCkKewogICAgUkVDVCByZWN0OwoKICAgIE5DX0dldEluc2lkZVJlY3QoIGh3bmQsICZyZWN0ICk7CgogICAgLyogQSB0b29sIHdpbmRvdyBoYXMgYSBzbWFsbGVyIENsb3NlIGJ1dHRvbiAqLwogICAgaWYgKEdldFdpbmRvd0xvbmdBKCBod25kLCBHV0xfRVhTVFlMRSApICYgV1NfRVhfVE9PTFdJTkRPVykKICAgIHsKICAgICAgICBJTlQgaUJtcEhlaWdodCA9IDExOyAvKiBXaW5kb3dzIGRvZXMgbm90IHVzZSBTTV9DWFNNU0laRSBhbmQgU01fQ1lTTVNJWkUgICAqLwogICAgICAgIElOVCBpQm1wV2lkdGggPSAxMTsgIC8qIGl0IHVzZXMgMTF4MTEgZm9yICB0aGUgY2xvc2UgYnV0dG9uIGluIHRvb2wgd2luZG93ICovCiAgICAgICAgSU5UIGlDYXB0aW9uSGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNNQ0FQVElPTik7CgogICAgICAgIHJlY3QudG9wID0gcmVjdC50b3AgKyAoaUNhcHRpb25IZWlnaHQgLSAxIC0gaUJtcEhlaWdodCkgLyAyOwogICAgICAgIHJlY3QubGVmdCA9IHJlY3QucmlnaHQgLSAoaUNhcHRpb25IZWlnaHQgKyAxICsgaUJtcFdpZHRoKSAvIDI7CiAgICAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGlCbXBIZWlnaHQ7CiAgICAgICAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIGlCbXBXaWR0aDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZWN0LmxlZnQgPSByZWN0LnJpZ2h0IC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpIC0gMTsKICAgICAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpIC0gMTsKICAgICAgICByZWN0LnRvcCArPSAyOwogICAgICAgIHJlY3QucmlnaHQgLT0gMjsKICAgIH0KICAgIERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QsIERGQ19DQVBUSU9OLAogICAgICAgICAgICAgICAgICAgICAgKERGQ1NfQ0FQVElPTkNMT1NFIHwKICAgICAgICAgICAgICAgICAgICAgICAoZG93biA/IERGQ1NfUFVTSEVEIDogMCkgfAogICAgICAgICAgICAgICAgICAgICAgIChiR3JheWVkID8gREZDU19JTkFDVElWRSA6IDApKSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgTkNfRHJhd01heEJ1dHRvbjk1CiAqCiAqICAgRHJhd3MgdGhlIG1heGltaXplIGJ1dHRvbiBmb3IgV2luOTUgc3R5bGUgd2luZG93cy4KICogICBJZiBiR3JheWVkIGlzIHRydWUsIHRoZW4gZHJhdyBhIGRpc2FibGVkIE1heGltaXplIGJ1dHRvbgogKi8Kc3RhdGljIHZvaWQgTkNfRHJhd01heEJ1dHRvbjk1KEhXTkQgaHduZCxIREMxNiBoZGMsQk9PTCBkb3duLCBCT09MIGJHcmF5ZWQpCnsKICAgIFJFQ1QgcmVjdDsKICAgIFVJTlQgZmxhZ3MgPSBJc1pvb21lZChod25kKSA/IERGQ1NfQ0FQVElPTlJFU1RPUkUgOiBERkNTX0NBUFRJT05NQVg7CgogICAgTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKICAgIGlmIChHZXRXaW5kb3dMb25nQSggaHduZCwgR1dMX1NUWUxFKSAmIFdTX1NZU01FTlUpCiAgICAgICAgcmVjdC5yaWdodCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwogICAgcmVjdC5sZWZ0ID0gcmVjdC5yaWdodCAtIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKTsKICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkgLSAxOwogICAgcmVjdC50b3AgKz0gMjsKICAgIHJlY3QucmlnaHQgLT0gMjsKICAgIGlmIChkb3duKSBmbGFncyB8PSBERkNTX1BVU0hFRDsKICAgIGlmIChiR3JheWVkKSBmbGFncyB8PSBERkNTX0lOQUNUSVZFOwogICAgRHJhd0ZyYW1lQ29udHJvbCggaGRjLCAmcmVjdCwgREZDX0NBUFRJT04sIGZsYWdzICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBOQ19EcmF3TWluQnV0dG9uOTUKICoKICogICBEcmF3cyB0aGUgbWluaW1pemUgYnV0dG9uIGZvciBXaW45NSBzdHlsZSB3aW5kb3dzLgogKiAgIElmIGJHcmF5ZWQgaXMgdHJ1ZSwgdGhlbiBkcmF3IGEgZGlzYWJsZWQgTWluaW1pemUgYnV0dG9uCiAqLwpzdGF0aWMgdm9pZCAgTkNfRHJhd01pbkJ1dHRvbjk1KEhXTkQgaHduZCxIREMxNiBoZGMsQk9PTCBkb3duLCBCT09MIGJHcmF5ZWQpCnsKICAgIFJFQ1QgcmVjdDsKICAgIFVJTlQgZmxhZ3MgPSBERkNTX0NBUFRJT05NSU47CiAgICBEV09SRCBzdHlsZSA9IEdldFdpbmRvd0xvbmdBKCBod25kLCBHV0xfU1RZTEUgKTsKCiAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwogICAgaWYgKHN0eWxlICYgV1NfU1lTTUVOVSkKICAgICAgICByZWN0LnJpZ2h0IC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKSArIDE7CiAgICBpZiAoc3R5bGUgJiAoV1NfTUFYSU1JWkVCT1h8V1NfTUlOSU1JWkVCT1gpKQogICAgICAgIHJlY3QucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpIC0gMjsKICAgIHJlY3QubGVmdCA9IHJlY3QucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSk7CiAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpIC0gMTsKICAgIHJlY3QudG9wICs9IDI7CiAgICByZWN0LnJpZ2h0IC09IDI7CiAgICBpZiAoZG93bikgZmxhZ3MgfD0gREZDU19QVVNIRUQ7CiAgICBpZiAoYkdyYXllZCkgZmxhZ3MgfD0gREZDU19JTkFDVElWRTsKICAgIERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QsIERGQ19DQVBUSU9OLCBmbGFncyApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5DX0RyYXdGcmFtZQogKgogKiBEcmF3IGEgd2luZG93IGZyYW1lIGluc2lkZSB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLCBhbmQgdXBkYXRlIHRoZSByZWN0YW5nbGUuCiAqIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIGZyYW1lIG11c3QgYmUgc2VsZWN0ZWQgaW4gdGhlIERDLgogKi8Kc3RhdGljIHZvaWQgTkNfRHJhd0ZyYW1lKCBIREMgaGRjLCBSRUNUICpyZWN0LCBCT09MIGRsZ0ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgYWN0aXZlICkKewogICAgSU5UIHdpZHRoLCBoZWlnaHQ7CgogICAgaWYgKFRXRUFLX1dpbmVMb29rICE9IFdJTjMxX0xPT0spCglFUlIoIkNhbGxlZCBpbiBXaW45NSBtb2RlLiBBaWVlISBQbGVhc2UgcmVwb3J0IHRoaXMuXG4iICk7CgogICAgaWYgKGRsZ0ZyYW1lKQogICAgewoJd2lkdGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpIC0gMTsKCWhlaWdodCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSkgLSAxOwogICAgICAgIFNlbGVjdE9iamVjdCggaGRjLCBHZXRTeXNDb2xvckJydXNoKGFjdGl2ZSA/IENPTE9SX0FDVElWRUNBUFRJT04gOgoJCQkJCQlDT0xPUl9JTkFDVElWRUNBUFRJT04pICk7CiAgICB9CiAgICBlbHNlCiAgICB7Cgl3aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hGUkFNRSkgLSAyOwoJaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSAtIDI7CiAgICAgICAgU2VsZWN0T2JqZWN0KCBoZGMsIEdldFN5c0NvbG9yQnJ1c2goYWN0aXZlID8gQ09MT1JfQUNUSVZFQk9SREVSIDoKCQkJCQkJQ09MT1JfSU5BQ1RJVkVCT1JERVIpICk7CiAgICB9CgogICAgICAvKiBEcmF3IGZyYW1lICovCiAgICBQYXRCbHQoIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgaGVpZ2h0LCBQQVRDT1BZICk7CiAgICBQYXRCbHQoIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogICAgICAgICAgICAgIHdpZHRoLCByZWN0LT5ib3R0b20gLSByZWN0LT50b3AsIFBBVENPUFkgKTsKICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSAxLAogICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgLWhlaWdodCwgUEFUQ09QWSApOwogICAgUGF0Qmx0KCBoZGMsIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+dG9wLAogICAgICAgICAgICAgIC13aWR0aCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBQQVRDT1BZICk7CgogICAgaWYgKGRsZ0ZyYW1lKQogICAgewoJSW5mbGF0ZVJlY3QoIHJlY3QsIC13aWR0aCwgLWhlaWdodCApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIElOVCBkZWNZT2ZmID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZSQU1FKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKSAtIDE7CglJTlQgZGVjWE9mZiA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSkgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0laRSkgLSAxOwoKICAgICAgLyogRHJhdyBpbm5lciByZWN0YW5nbGUgKi8KCglTZWxlY3RPYmplY3QoIGhkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkgKTsKCVJlY3RhbmdsZSggaGRjLCByZWN0LT5sZWZ0ICsgd2lkdGgsIHJlY3QtPnRvcCArIGhlaWdodCwKCQkgICAgIHJlY3QtPnJpZ2h0IC0gd2lkdGggLCByZWN0LT5ib3R0b20gLSBoZWlnaHQgKTsKCiAgICAgIC8qIERyYXcgdGhlIGRlY29yYXRpb25zICovCgoJTW92ZVRvRXgoIGhkYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wICsgZGVjWU9mZiwgTlVMTCApOwoJTGluZVRvKCBoZGMsIHJlY3QtPmxlZnQgKyB3aWR0aCwgcmVjdC0+dG9wICsgZGVjWU9mZiApOwoJTW92ZVRvRXgoIGhkYywgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT50b3AgKyBkZWNZT2ZmLCBOVUxMICk7CglMaW5lVG8oIGhkYywgcmVjdC0+cmlnaHQgLSB3aWR0aCAtIDEsIHJlY3QtPnRvcCArIGRlY1lPZmYgKTsKCU1vdmVUb0V4KCBoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIGRlY1lPZmYsIE5VTEwgKTsKCUxpbmVUbyggaGRjLCByZWN0LT5sZWZ0ICsgd2lkdGgsIHJlY3QtPmJvdHRvbSAtIGRlY1lPZmYgKTsKCU1vdmVUb0V4KCBoZGMsIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+Ym90dG9tIC0gZGVjWU9mZiwgTlVMTCApOwoJTGluZVRvKCBoZGMsIHJlY3QtPnJpZ2h0IC0gd2lkdGggLSAxLCByZWN0LT5ib3R0b20gLSBkZWNZT2ZmICk7CgoJTW92ZVRvRXgoIGhkYywgcmVjdC0+bGVmdCArIGRlY1hPZmYsIHJlY3QtPnRvcCwgTlVMTCApOwoJTGluZVRvKCBoZGMsIHJlY3QtPmxlZnQgKyBkZWNYT2ZmLCByZWN0LT50b3AgKyBoZWlnaHQpOwoJTW92ZVRvRXgoIGhkYywgcmVjdC0+bGVmdCArIGRlY1hPZmYsIHJlY3QtPmJvdHRvbSAtIDEsIE5VTEwgKTsKCUxpbmVUbyggaGRjLCByZWN0LT5sZWZ0ICsgZGVjWE9mZiwgcmVjdC0+Ym90dG9tIC0gaGVpZ2h0IC0gMSApOwoJTW92ZVRvRXgoIGhkYywgcmVjdC0+cmlnaHQgLSBkZWNYT2ZmLCByZWN0LT50b3AsIE5VTEwgKTsKCUxpbmVUbyggaGRjLCByZWN0LT5yaWdodCAtIGRlY1hPZmYsIHJlY3QtPnRvcCArIGhlaWdodCApOwoJTW92ZVRvRXgoIGhkYywgcmVjdC0+cmlnaHQgLSBkZWNYT2ZmLCByZWN0LT5ib3R0b20gLSAxLCBOVUxMICk7CglMaW5lVG8oIGhkYywgcmVjdC0+cmlnaHQgLSBkZWNYT2ZmLCByZWN0LT5ib3R0b20gLSBoZWlnaHQgLSAxICk7CgoJSW5mbGF0ZVJlY3QoIHJlY3QsIC13aWR0aCAtIDEsIC1oZWlnaHQgLSAxICk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgdm9pZCAgTkNfRHJhd0ZyYW1lOTUoCiAqICAgICAgSERDICBoZGMsCiAqICAgICAgUkVDVCAgKnJlY3QsCiAqICAgICAgQk9PTCAgYWN0aXZlLAogKiAgICAgIERXT1JEIHN0eWxlLAogKiAgICAgIERXT1JEIGV4U3R5bGUgKQogKgogKiAgIERyYXcgYSB3aW5kb3cgZnJhbWUgaW5zaWRlIHRoZSBnaXZlbiByZWN0YW5nbGUsIGFuZCB1cGRhdGUgdGhlIHJlY3RhbmdsZS4KICoKICogICBCdWdzCiAqICAgICAgICBNYW55LiAgRmlyc3QsIGp1c3Qgd2hhdCBJUyBhIGZyYW1lIGluIFdpbjk1PyAgTm90ZSB0aGF0IHRoZSAzRCBsb29rCiAqICAgICAgICBvbiB0aGUgb3V0ZXIgZWRnZSBpcyBoYW5kbGVkIGJ5IE5DX0RvTkNQYWludDk1LiAgQXMgaXMgdGhlIGlubmVyCiAqICAgICAgICBlZGdlLiAgVGhlIGlubmVyIHJlY3RhbmdsZSBqdXN0IGluc2lkZSB0aGUgZnJhbWUgaXMgaGFuZGxlZCBieSB0aGUKICogICAgICAgIENhcHRpb24gY29kZS4KICoKICogICAgICAgIEluIHNob3J0LCBmb3IgbW9zdCBwZW9wbGUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgbm9wICh1bmxlc3MKICogICAgICAgIHlvdSBMSUtFIHRoaWNrIGJvcmRlcnMgaW4gV2luOTUvTlQ0LjAgLS0gSSd2ZSBiZWVuIHdvcmtpbmcgd2l0aAogKiAgICAgICAgdGhlbSBsYXRlbHksIGJ1dCBqdXN0IHRvIGdldCB0aGlzIGNvZGUgcmlnaHQpLiAgRXZlbiBzbywgaXQgZG9lc24ndAogKiAgICAgICAgYXBwZWFyIHRvIGJlIHNvLiAgSXQncyBiZWluZyB3b3JrZWQgb24uLi4KICoKICogICBSZXZpc2lvbiBoaXN0b3J5CiAqICAgICAgICAwNi1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gKGJhc2VkIG9uIE5DX0RyYXdGcmFtZSkKICogICAgICAgIDAyLUp1bi0xOTk4IEVyaWMgS29obCAoZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGUpCiAqICAgICAgICAgICAgIFNvbWUgbWlub3IgZml4ZXMuCiAqICAgICAgICAyOS1KdW4tMTk5OSBPdmUgS+V2ZW4gKG92ZWtAYXJjdGljbmV0Lm5vKQogKiAgICAgICAgICAgICBGaXhlZCBhIGZpeCBvciBzb21ldGhpbmcuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkICBOQ19EcmF3RnJhbWU5NSgKICAgIEhEQyAgaGRjLAogICAgUkVDVCAgKnJlY3QsCiAgICBCT09MICBhY3RpdmUsCiAgICBEV09SRCBzdHlsZSwKICAgIERXT1JEIGV4U3R5bGUpCnsKICAgIElOVCB3aWR0aCwgaGVpZ2h0OwoKICAgIC8qIEZpcnN0bHkgdGhlICJ0aGljayIgZnJhbWUgKi8KICAgIGlmIChzdHlsZSAmIFdTX1RISUNLRlJBTUUpCiAgICB7Cgl3aWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hGUkFNRSkgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRExHRlJBTUUpOwoJaGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZSQU1FKSAtIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lETEdGUkFNRSk7CgogICAgICAgIFNlbGVjdE9iamVjdCggaGRjLCBHZXRTeXNDb2xvckJydXNoKGFjdGl2ZSA/IENPTE9SX0FDVElWRUJPUkRFUiA6CgkJICAgICAgQ09MT1JfSU5BQ1RJVkVCT1JERVIpICk7CiAgICAgICAgLyogRHJhdyBmcmFtZSAqLwogICAgICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgaGVpZ2h0LCBQQVRDT1BZICk7CiAgICAgICAgUGF0Qmx0KCBoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKICAgICAgICAgICAgICAgICAgd2lkdGgsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCwgUEFUQ09QWSApOwogICAgICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSAxLAogICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIC1oZWlnaHQsIFBBVENPUFkgKTsKICAgICAgICBQYXRCbHQoIGhkYywgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgIC13aWR0aCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBQQVRDT1BZICk7CgogICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCAtd2lkdGgsIC1oZWlnaHQgKTsKICAgIH0KCiAgICAvKiBOb3cgdGhlIG90aGVyIGJpdCBvZiB0aGUgZnJhbWUgKi8KICAgIGlmICgoc3R5bGUgJiAoV1NfQk9SREVSfFdTX0RMR0ZSQU1FKSkgfHwKICAgICAgICAoZXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKQogICAgewogICAgICAgIHdpZHRoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWERMR0ZSQU1FKSAtIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hFREdFKTsKICAgICAgICBoZWlnaHQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRExHRlJBTUUpIC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUVER0UpOwogICAgICAgIC8qIFRoaXMgc2hvdWxkIGdpdmUgYSB2YWx1ZSBvZiAxIHRoYXQgc2hvdWxkIGFsc28gd29yayBmb3IgYSBib3JkZXIgKi8KCiAgICAgICAgU2VsZWN0T2JqZWN0KCBoZGMsIEdldFN5c0NvbG9yQnJ1c2goCiAgICAgICAgICAgICAgICAgICAgICAoZXhTdHlsZSAmIChXU19FWF9ETEdNT0RBTEZSQU1FfFdTX0VYX0NMSUVOVEVER0UpKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfM0RGQUNFIDoKICAgICAgICAgICAgICAgICAgICAgIChleFN0eWxlICYgV1NfRVhfU1RBVElDRURHRSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dJTkRPV0ZSQU1FIDoKICAgICAgICAgICAgICAgICAgICAgIChzdHlsZSAmIChXU19ETEdGUkFNRXxXU19USElDS0ZSQU1FKSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SXzNERkFDRSA6CiAgICAgICAgICAgICAgICAgICAgICAvKiBlbHNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0lORE9XRlJBTUUpKTsKCiAgICAgICAgLyogRHJhdyBmcmFtZSAqLwogICAgICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgaGVpZ2h0LCBQQVRDT1BZICk7CiAgICAgICAgUGF0Qmx0KCBoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKICAgICAgICAgICAgICAgICAgd2lkdGgsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCwgUEFUQ09QWSApOwogICAgICAgIFBhdEJsdCggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSAxLAogICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIC1oZWlnaHQsIFBBVENPUFkgKTsKICAgICAgICBQYXRCbHQoIGhkYywgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgIC13aWR0aCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLCBQQVRDT1BZICk7CgogICAgICAgIEluZmxhdGVSZWN0KCByZWN0LCAtd2lkdGgsIC1oZWlnaHQgKTsKICAgIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfRHJhd0NhcHRpb24KICoKICogRHJhdyB0aGUgd2luZG93IGNhcHRpb24uCiAqIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIHdpbmRvdyBmcmFtZSBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBEQy4KICovCnN0YXRpYyB2b2lkIE5DX0RyYXdDYXB0aW9uKCBIREMgaGRjLCBSRUNUICpyZWN0LCBIV05EIGh3bmQsCgkJCSAgICBEV09SRCBzdHlsZSwgQk9PTCBhY3RpdmUgKQp7CiAgICBSRUNUIHIgPSAqcmVjdDsKICAgIGNoYXIgYnVmZmVyWzI1Nl07CgogICAgaWYgKCFoYml0bWFwQ2xvc2UpCiAgICB7CglpZiAoIShoYml0bWFwQ2xvc2UgPSBMb2FkQml0bWFwQSggMCwgTUFLRUlOVFJFU09VUkNFQShPQk1fT0xEX0NMT1NFKSApKSkgcmV0dXJuOwogICAgfQoKICAgIGlmIChHZXRXaW5kb3dMb25nQSggaHduZCwgR1dMX0VYU1RZTEUpICYgV1NfRVhfRExHTU9EQUxGUkFNRSkKICAgIHsKICAgICAgICBIQlJVU0ggaGJydXNoT2xkID0gU2VsZWN0T2JqZWN0KGhkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1cpICk7CglQYXRCbHQoIGhkYywgci5sZWZ0LCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSxQQVRDT1BZICk7CglQYXRCbHQoIGhkYywgci5yaWdodC0xLCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSwgUEFUQ09QWSApOwoJUGF0Qmx0KCBoZGMsIHIubGVmdCwgci50b3AtMSwgci5yaWdodC1yLmxlZnQsIDEsIFBBVENPUFkgKTsKCXIubGVmdCsrOwoJci5yaWdodC0tOwoJU2VsZWN0T2JqZWN0KCBoZGMsIGhicnVzaE9sZCApOwogICAgfQogICAgTW92ZVRvRXgoIGhkYywgci5sZWZ0LCByLmJvdHRvbSwgTlVMTCApOwogICAgTGluZVRvKCBoZGMsIHIucmlnaHQsIHIuYm90dG9tICk7CgogICAgaWYgKHN0eWxlICYgV1NfU1lTTUVOVSkKICAgIHsKCU5DX0RyYXdTeXNCdXR0b24oIGh3bmQsIGhkYywgRkFMU0UgKTsKCXIubGVmdCArPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwoJTW92ZVRvRXgoIGhkYywgci5sZWZ0IC0gMSwgci50b3AsIE5VTEwgKTsKCUxpbmVUbyggaGRjLCByLmxlZnQgLSAxLCByLmJvdHRvbSApOwogICAgfQogICAgRmlsbFJlY3QoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2goYWN0aXZlID8gQ09MT1JfQUNUSVZFQ0FQVElPTiA6IENPTE9SX0lOQUNUSVZFQ0FQVElPTikgKTsKICAgIGlmIChzdHlsZSAmIFdTX01BWElNSVpFQk9YKQogICAgewoJTkNfRHJhd01heEJ1dHRvbiggaHduZCwgaGRjLCBGQUxTRSApOwoJci5yaWdodCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwogICAgfQogICAgaWYgKHN0eWxlICYgV1NfTUlOSU1JWkVCT1gpCiAgICB7CglOQ19EcmF3TWluQnV0dG9uKCBod25kLCBoZGMsIEZBTFNFICk7CglyLnJpZ2h0IC09IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKSArIDE7CiAgICB9CgogICAgaWYgKEdldFdpbmRvd1RleHRBKCBod25kLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkpCiAgICB7CglpZiAoYWN0aXZlKSBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX0NBUFRJT05URVhUICkgKTsKCWVsc2UgU2V0VGV4dENvbG9yKCBoZGMsIEdldFN5c0NvbG9yKCBDT0xPUl9JTkFDVElWRUNBUFRJT05URVhUICkgKTsKCVNldEJrTW9kZSggaGRjLCBUUkFOU1BBUkVOVCApOwoJRHJhd1RleHRBKCBoZGMsIGJ1ZmZlciwgLTEsICZyLAogICAgICAgICAgICAgICAgICAgICBEVF9TSU5HTEVMSU5FIHwgRFRfQ0VOVEVSIHwgRFRfVkNFTlRFUiB8IERUX05PUFJFRklYICk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgTkNfRHJhd0NhcHRpb245NSgKICogICAgICBIREMgIGhkYywKICogICAgICBSRUNUICpyZWN0LAogKiAgICAgIEhXTkQgaHduZCwKICogICAgICBEV09SRCAgc3R5bGUsCiAqICAgICAgQk9PTCBhY3RpdmUgKQogKgogKiAgIERyYXcgdGhlIHdpbmRvdyBjYXB0aW9uIGZvciBXaW45NSBzdHlsZSB3aW5kb3dzLgogKiAgIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIHdpbmRvdyBmcmFtZSBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBEQy4KICoKICogICBCdWdzCiAqICAgICAgICBIZXksIGEgZnVuY3Rpb24gdGhhdCBmaW5hbGx5IHdvcmtzISAgV2VsbCwgYWxtb3N0LgogKiAgICAgICAgSXQncyBiZWluZyB3b3JrZWQgb24uCiAqCiAqICAgUmV2aXNpb24gaGlzdG9yeQogKiAgICAgICAgMDUtSnVsLTE5OTcgRGF2ZSBDdXRoYmVydCAoZGFjdXRAZWNlLmNtdS5lZHUpCiAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgogKiAgICAgICAgMDItSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKICogICAgICAgICAgICAgU29tZSBtaW5vciBmaXhlcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgIE5DX0RyYXdDYXB0aW9uOTUoCiAgICBIREMgIGhkYywKICAgIFJFQ1QgKnJlY3QsCiAgICBIV05EIGh3bmQsCiAgICBEV09SRCAgc3R5bGUsCiAgICBEV09SRCAgZXhTdHlsZSwKICAgIEJPT0wgYWN0aXZlICkKewogICAgUkVDVCAgciA9ICpyZWN0OwogICAgY2hhciAgICBidWZmZXJbMjU2XTsKICAgIEhQRU4gIGhQcmV2UGVuOwogICAgSE1FTlUgaFN5c01lbnU7CgogICAgaFByZXZQZW4gPSBTZWxlY3RPYmplY3QoIGhkYywgU1lTQ09MT1JfR2V0UGVuKAogICAgICAgICAgICAgICAgICAgICAoKGV4U3R5bGUgJiAoV1NfRVhfU1RBVElDRURHRXxXU19FWF9DTElFTlRFREdFfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19FWF9ETEdNT0RBTEZSQU1FKSkgPT0gV1NfRVhfU1RBVElDRURHRSkgPwogICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0lORE9XRlJBTUUgOiBDT0xPUl8zREZBQ0UpICk7CiAgICBNb3ZlVG9FeCggaGRjLCByLmxlZnQsIHIuYm90dG9tIC0gMSwgTlVMTCApOwogICAgTGluZVRvKCBoZGMsIHIucmlnaHQsIHIuYm90dG9tIC0gMSApOwogICAgU2VsZWN0T2JqZWN0KCBoZGMsIGhQcmV2UGVuICk7CiAgICByLmJvdHRvbS0tOwoKICAgIEZpbGxSZWN0KCBoZGMsICZyLCBHZXRTeXNDb2xvckJydXNoKGFjdGl2ZSA/IENPTE9SX0FDVElWRUNBUFRJT04gOgoJCQkJCSAgICBDT0xPUl9JTkFDVElWRUNBUFRJT04pICk7CgogICAgaWYgKChzdHlsZSAmIFdTX1NZU01FTlUpICYmICEoZXhTdHlsZSAmIFdTX0VYX1RPT0xXSU5ET1cpKSB7CglpZiAoTkNfRHJhd1N5c0J1dHRvbjk1IChod25kLCBoZGMsIEZBTFNFKSkKCSAgICByLmxlZnQgKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pIC0gMTsKICAgIH0KCiAgICBpZiAoc3R5bGUgJiBXU19TWVNNRU5VKQogICAgewoJVUlOVCBzdGF0ZTsKCgkvKiBHbyBnZXQgdGhlIHN5c21lbnUgKi8KCWhTeXNNZW51ID0gR2V0U3lzdGVtTWVudShod25kLCBGQUxTRSk7CglzdGF0ZSA9IEdldE1lbnVTdGF0ZShoU3lzTWVudSwgU0NfQ0xPU0UsIE1GX0JZQ09NTUFORCk7CgoJLyogRHJhdyBhIGdyYXllZCBjbG9zZSBidXR0b24gaWYgZGlzYWJsZWQgYW5kIGEgbm9ybWFsIG9uZSBpZiBTQ19DTE9TRSBpcyBub3QgdGhlcmUgKi8KCU5DX0RyYXdDbG9zZUJ1dHRvbjk1IChod25kLCBoZGMsIEZBTFNFLAoJCQkgICAgICAoKCgoc3RhdGUgJiBNRl9ESVNBQkxFRCkgfHwgKHN0YXRlICYgTUZfR1JBWUVEKSkpICYmIChzdGF0ZSAhPSAweEZGRkZGRkZGKSkpOwoJci5yaWdodCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTikgLSAxOwoKCWlmICgoc3R5bGUgJiBXU19NQVhJTUlaRUJPWCkgfHwgKHN0eWxlICYgV1NfTUlOSU1JWkVCT1gpKQoJewoJICAgIC8qIEluIHdpbjk1IHRoZSB0d28gYnV0dG9ucyBhcmUgYWx3YXlzIHRoZXJlICovCgkgICAgLyogQnV0IGlmIHRoZSBtZW51IGl0ZW0gaXMgbm90IGluIHRoZSBtZW51IHRoZXkncmUgZGlzYWJsZWQqLwoKCSAgICBOQ19EcmF3TWF4QnV0dG9uOTUoIGh3bmQsIGhkYywgRkFMU0UsICghKHN0eWxlICYgV1NfTUFYSU1JWkVCT1gpKSk7CgkgICAgci5yaWdodCAtPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0laRSkgKyAxOwoKCSAgICBOQ19EcmF3TWluQnV0dG9uOTUoIGh3bmQsIGhkYywgRkFMU0UsICAoIShzdHlsZSAmIFdTX01JTklNSVpFQk9YKSkpOwoJICAgIHIucmlnaHQgLT0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFNJWkUpICsgMTsKCX0KICAgIH0KCiAgICBpZiAoR2V0V2luZG93VGV4dEEoIGh3bmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKSkgewoJTk9OQ0xJRU5UTUVUUklDU0EgbmNsbTsKCUhGT05UIGhGb250LCBoT2xkRm9udDsKCW5jbG0uY2JTaXplID0gc2l6ZW9mKE5PTkNMSUVOVE1FVFJJQ1NBKTsKCVN5c3RlbVBhcmFtZXRlcnNJbmZvQSAoU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIDAsICZuY2xtLCAwKTsKCWlmIChleFN0eWxlICYgV1NfRVhfVE9PTFdJTkRPVykKCSAgICBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEgKCZuY2xtLmxmU21DYXB0aW9uRm9udCk7CgllbHNlCgkgICAgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBICgmbmNsbS5sZkNhcHRpb25Gb250KTsKCWhPbGRGb250ID0gU2VsZWN0T2JqZWN0IChoZGMsIGhGb250KTsKCWlmIChhY3RpdmUpIFNldFRleHRDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfQ0FQVElPTlRFWFQgKSApOwoJZWxzZSBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKSApOwoJU2V0QmtNb2RlKCBoZGMsIFRSQU5TUEFSRU5UICk7CglyLmxlZnQgKz0gMjsKCURyYXdUZXh0QSggaGRjLCBidWZmZXIsIC0xLCAmciwKCQkgICAgIERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSIHwgRFRfTk9QUkVGSVggfCBEVF9MRUZUICk7CglEZWxldGVPYmplY3QgKFNlbGVjdE9iamVjdCAoaGRjLCBoT2xkRm9udCkpOwogICAgfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfRG9OQ1BhaW50CiAqCiAqIFBhaW50IHRoZSBub24tY2xpZW50IGFyZWEuIGNsaXAgaXMgY3VycmVudGx5IHVudXNlZC4KICovCnN0YXRpYyB2b2lkIE5DX0RvTkNQYWludCggSFdORCBod25kLCBIUkdOIGNsaXAsIEJPT0wgc3VwcHJlc3NfbWVudXBhaW50ICkKewogICAgSERDIGhkYzsKICAgIFJFQ1QgcmVjdDsKICAgIEJPT0wgYWN0aXZlOwogICAgV05EICp3bmRQdHI7CiAgICBEV09SRCBkd1N0eWxlLCBkd0V4U3R5bGU7CiAgICBXT1JEIGZsYWdzOwogICAgUkVDVCByZWN0Q2xpZW50LCByZWN0V2luZG93OwogICAgaW50IGhhc19tZW51OwoKICAgIGlmICghKHduZFB0ciA9IFdJTl9HZXRQdHIoIGh3bmQgKSkgfHwgd25kUHRyID09IFdORF9PVEhFUl9QUk9DRVNTKSByZXR1cm47CiAgICBoYXNfbWVudSA9IEhBU19NRU5VKHduZFB0cik7CiAgICBkd1N0eWxlID0gd25kUHRyLT5kd1N0eWxlOwogICAgZHdFeFN0eWxlID0gd25kUHRyLT5kd0V4U3R5bGU7CiAgICBmbGFncyA9IHduZFB0ci0+ZmxhZ3M7CiAgICByZWN0Q2xpZW50ID0gd25kUHRyLT5yZWN0Q2xpZW50OwogICAgcmVjdFdpbmRvdyA9IHduZFB0ci0+cmVjdFdpbmRvdzsKICAgIFdJTl9SZWxlYXNlUHRyKCB3bmRQdHIgKTsKCiAgICBpZiAoIGR3U3R5bGUgJiBXU19NSU5JTUlaRSB8fAogICAgICAgICAhV0lOX0lzV2luZG93RHJhd2FibGUoIGh3bmQsIDAgKSkgcmV0dXJuOyAvKiBOb3RoaW5nIHRvIGRvICovCgogICAgYWN0aXZlICA9IGZsYWdzICYgV0lOX05DQUNUSVZBVEVEOwoKICAgIFRSQUNFKCIlMDR4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKCiAgICBpZiAoIShoZGMgPSBHZXREQ0V4KCBod25kLCAoY2xpcCA+IDEpID8gY2xpcCA6IDAsIERDWF9VU0VTVFlMRSB8IERDWF9XSU5ET1cgfAoJCQkgICAgICAoKGNsaXAgPiAxKSA/IChEQ1hfSU5URVJTRUNUUkdOIHwgRENYX0tFRVBDTElQUkdOKTogMCkgKSkpIHJldHVybjsKCiAgICBpZiAoRXhjbHVkZVZpc1JlY3QxNiggaGRjLCByZWN0Q2xpZW50LmxlZnQtcmVjdFdpbmRvdy5sZWZ0LAoJCSAgICAgICAgcmVjdENsaWVudC50b3AtcmVjdFdpbmRvdy50b3AsCgkJICAgICAgICByZWN0Q2xpZW50LnJpZ2h0LXJlY3RXaW5kb3cubGVmdCwKCQkgICAgICAgIHJlY3RDbGllbnQuYm90dG9tLXJlY3RXaW5kb3cudG9wICkKCT09IE5VTExSRUdJT04pCiAgICB7CglSZWxlYXNlREMoIGh3bmQsIGhkYyApOwoJcmV0dXJuOwogICAgfQoKICAgIHJlY3QudG9wID0gcmVjdC5sZWZ0ID0gMDsKICAgIHJlY3QucmlnaHQgID0gcmVjdFdpbmRvdy5yaWdodCAtIHJlY3RXaW5kb3cubGVmdDsKICAgIHJlY3QuYm90dG9tID0gcmVjdFdpbmRvdy5ib3R0b20gLSByZWN0V2luZG93LnRvcDsKCiAgICBTZWxlY3RPYmplY3QoIGhkYywgU1lTQ09MT1JfR2V0UGVuKENPTE9SX1dJTkRPV0ZSQU1FKSApOwoKICAgIGlmIChIQVNfQU5ZRlJBTUUoIGR3U3R5bGUsIGR3RXhTdHlsZSApKQogICAgewogICAgICAgIFNlbGVjdE9iamVjdCggaGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSApOwogICAgICAgIFJlY3RhbmdsZSggaGRjLCAwLCAwLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSApOwogICAgICAgIEluZmxhdGVSZWN0KCAmcmVjdCwgLTEsIC0xICk7CiAgICB9CgogICAgaWYgKEhBU19USElDS0ZSQU1FKCBkd1N0eWxlLCBkd0V4U3R5bGUgKSkKICAgICAgICBOQ19EcmF3RnJhbWUoaGRjLCAmcmVjdCwgRkFMU0UsIGFjdGl2ZSApOwogICAgZWxzZSBpZiAoSEFTX0RMR0ZSQU1FKCBkd1N0eWxlLCBkd0V4U3R5bGUgKSkKICAgICAgICBOQ19EcmF3RnJhbWUoIGhkYywgJnJlY3QsIFRSVUUsIGFjdGl2ZSApOwoKICAgIGlmICgoZHdTdHlsZSAmIFdTX0NBUFRJT04pID09IFdTX0NBUFRJT04pCiAgICB7CiAgICAgICAgUkVDVCByID0gcmVjdDsKICAgICAgICByLmJvdHRvbSA9IHJlY3QudG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpOwogICAgICAgIHJlY3QudG9wICs9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lTSVpFKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lCT1JERVIpOwogICAgICAgIE5DX0RyYXdDYXB0aW9uKCBoZGMsICZyLCBod25kLCBkd1N0eWxlLCBhY3RpdmUgKTsKICAgIH0KCiAgICBpZiAoaGFzX21lbnUpCiAgICB7CglSRUNUIHIgPSByZWN0OwoJci5ib3R0b20gPSByZWN0LnRvcCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lNRU5VKTsgIC8qIGRlZmF1bHQgaGVpZ2h0ICovCglyZWN0LnRvcCArPSBNRU5VX0RyYXdNZW51QmFyKCBoZGMsICZyLCBod25kLCBzdXBwcmVzc19tZW51cGFpbnQgKTsKICAgIH0KCiAgICAgIC8qIERyYXcgdGhlIHNjcm9sbC1iYXJzICovCgogICAgaWYgKGR3U3R5bGUgJiBXU19WU0NST0xMKQogICAgICAgIFNDUk9MTF9EcmF3U2Nyb2xsQmFyKCBod25kLCBoZGMsIFNCX1ZFUlQsIFRSVUUsIFRSVUUgKTsKICAgIGlmIChkd1N0eWxlICYgV1NfSFNDUk9MTCkKICAgICAgICBTQ1JPTExfRHJhd1Njcm9sbEJhciggaHduZCwgaGRjLCBTQl9IT1JaLCBUUlVFLCBUUlVFICk7CgogICAgICAvKiBEcmF3IHRoZSAic2l6ZS1ib3giICovCgogICAgaWYgKChkd1N0eWxlICYgV1NfVlNDUk9MTCkgJiYgKGR3U3R5bGUgJiBXU19IU0NST0xMKSkKICAgIHsKICAgICAgICBSRUNUIHIgPSByZWN0OwogICAgICAgIHIubGVmdCA9IHIucmlnaHQgLSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCkgKyAxOwogICAgICAgIHIudG9wICA9IHIuYm90dG9tIC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWUhTQ1JPTEwpICsgMTsKCWlmKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikgewoJICByLmxlZnQrKzsKCSAgci50b3ArKzsKCX0KICAgICAgICBGaWxsUmVjdCggaGRjLCAmciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9TQ1JPTExCQVIpICk7CiAgICB9CgogICAgUmVsZWFzZURDKCBod25kLCBoZGMgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICB2b2lkICBOQ19Eb05DUGFpbnQ5NSgKICogICAgICBIV05EICBod25kLAogKiAgICAgIEhSR04gIGNsaXAsCiAqICAgICAgQk9PTCAgc3VwcHJlc3NfbWVudXBhaW50ICkKICoKICogICBQYWludCB0aGUgbm9uLWNsaWVudCBhcmVhIGZvciBXaW45NSB3aW5kb3dzLiAgVGhlIGNsaXAgcmVnaW9uIGlzCiAqICAgY3VycmVudGx5IGlnbm9yZWQuCiAqCiAqICAgQnVncwogKiAgICAgICAgZ3JlcCAtRSAtQTEwIC1CNSBcKDk1XClcfFwoQnVnc1wpXHxcKEZJWE1FXCkgd2luZG93cy9ub25jbGllbnQuYyBcCiAqICAgICAgICAgICBtaXNjL3R3ZWFrLmMgY29udHJvbHMvbWVudS5jICAjIDotKQogKgogKiAgIFJldmlzaW9uIGhpc3RvcnkKICogICAgICAgIDAzLUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogKiAgICAgICAgICAgICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgogKiAgICAgICAgMTAtSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKICogICAgICAgICAgICAgRml4ZWQgc29tZSBidWdzLgogKiAgICAgICAgMjktSnVuLTE5OTkgT3ZlIEvldmVuIChvdmVrQGFyY3RpY25ldC5ubykKICogICAgICAgICAgICAgU3RyZWFtbGluZWQgd2luZG93IHN0eWxlIGNoZWNrcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgIE5DX0RvTkNQYWludDk1KAogICAgSFdORCAgaHduZCwKICAgIEhSR04gIGNsaXAsCiAgICBCT09MICBzdXBwcmVzc19tZW51cGFpbnQgKQp7CiAgICBIREMgaGRjOwogICAgUkVDVCByZnV6eiwgcmVjdCwgcmVjdENsaXA7CiAgICBCT09MIGFjdGl2ZTsKICAgIFdORCAqd25kUHRyOwogICAgRFdPUkQgZHdTdHlsZSwgZHdFeFN0eWxlOwogICAgV09SRCBmbGFnczsKICAgIFJFQ1QgcmVjdENsaWVudCwgcmVjdFdpbmRvdzsKICAgIGludCBoYXNfbWVudTsKCiAgICBpZiAoISh3bmRQdHIgPSBXSU5fR2V0UHRyKCBod25kICkpIHx8IHduZFB0ciA9PSBXTkRfT1RIRVJfUFJPQ0VTUykgcmV0dXJuOwogICAgaGFzX21lbnUgPSBIQVNfTUVOVSh3bmRQdHIpOwogICAgZHdTdHlsZSA9IHduZFB0ci0+ZHdTdHlsZTsKICAgIGR3RXhTdHlsZSA9IHduZFB0ci0+ZHdFeFN0eWxlOwogICAgZmxhZ3MgPSB3bmRQdHItPmZsYWdzOwogICAgcmVjdENsaWVudCA9IHduZFB0ci0+cmVjdENsaWVudDsKICAgIHJlY3RXaW5kb3cgPSB3bmRQdHItPnJlY3RXaW5kb3c7CiAgICBXSU5fUmVsZWFzZVB0ciggd25kUHRyICk7CgogICAgaWYgKCBkd1N0eWxlICYgV1NfTUlOSU1JWkUgfHwKICAgICAgICAgIVdJTl9Jc1dpbmRvd0RyYXdhYmxlKCBod25kLCAwICkpIHJldHVybjsgLyogTm90aGluZyB0byBkbyAqLwoKICAgIGFjdGl2ZSAgPSBmbGFncyAmIFdJTl9OQ0FDVElWQVRFRDsKCiAgICBUUkFDRSgiJTA0eCAlZFxuIiwgaHduZCwgYWN0aXZlICk7CgogICAgLyogTVNETiBkb2NzIGFyZSBwcmV0dHkgaWRpb3RpYyBoZXJlLCB0aGV5IHNheSBhcHAgQ0FOIHVzZSBjbGlwUmduIGluCiAgICAgICB0aGUgY2FsbCB0byBHZXREQ0V4IGltcGx5aW5nIHRoYXQgaXQgaXMgYWxsb3dlZCBub3QgdG8gdXNlIGl0IGVpdGhlci4KICAgICAgIEhvd2V2ZXIsIHRoZSBzdWdnZXN0ZWQgR2V0RENFeCggICAgLCBEQ1hfV0lORE9XIHwgRENYX0lOVEVSU0VDVFJHTikKICAgICAgIHdpbGwgY2F1c2UgY2xpcFJnbiB0byBiZSBkZWxldGVkIGFmdGVyIFJlbGVhc2VEQygpLgogICAgICAgTm93LCBob3cgaXMgdGhlICJzeXN0ZW0iIHN1cHBvc2VkIHRvIHRlbGwgd2hhdCBoYXBwZW5lZD8KICAgICAqLwoKICAgIGlmICghKGhkYyA9IEdldERDRXgoIGh3bmQsIChjbGlwID4gMSkgPyBjbGlwIDogMCwgRENYX1VTRVNUWUxFIHwgRENYX1dJTkRPVyB8CgkJCSAgICAgICgoY2xpcCA+IDEpID8oRENYX0lOVEVSU0VDVFJHTiB8IERDWF9LRUVQQ0xJUFJHTikgOiAwKSApKSkgcmV0dXJuOwoKCiAgICBpZiAoRXhjbHVkZVZpc1JlY3QxNiggaGRjLCByZWN0Q2xpZW50LmxlZnQtcmVjdFdpbmRvdy5sZWZ0LAoJCSAgICAgICAgcmVjdENsaWVudC50b3AtcmVjdFdpbmRvdy50b3AsCgkJICAgICAgICByZWN0Q2xpZW50LnJpZ2h0LXJlY3RXaW5kb3cubGVmdCwKCQkgICAgICAgIHJlY3RDbGllbnQuYm90dG9tLXJlY3RXaW5kb3cudG9wICkKCT09IE5VTExSRUdJT04pCiAgICB7CglSZWxlYXNlREMoIGh3bmQsIGhkYyApOwoJcmV0dXJuOwogICAgfQoKICAgIHJlY3QudG9wID0gcmVjdC5sZWZ0ID0gMDsKICAgIHJlY3QucmlnaHQgID0gcmVjdFdpbmRvdy5yaWdodCAtIHJlY3RXaW5kb3cubGVmdDsKICAgIHJlY3QuYm90dG9tID0gcmVjdFdpbmRvdy5ib3R0b20gLSByZWN0V2luZG93LnRvcDsKCiAgICBpZiggY2xpcCA+IDEgKQoJR2V0UmduQm94KCBjbGlwLCAmcmVjdENsaXAgKTsKICAgIGVsc2UKICAgIHsKCWNsaXAgPSAwOwoJcmVjdENsaXAgPSByZWN0OwogICAgfQoKICAgIFNlbGVjdE9iamVjdCggaGRjLCBTWVNDT0xPUl9HZXRQZW4oQ09MT1JfV0lORE9XRlJBTUUpICk7CgogICAgaWYgKEhBU19TVEFUSUNPVVRFUkZSQU1FKGR3U3R5bGUsIGR3RXhTdHlsZSkpIHsKICAgICAgICBEcmF3RWRnZSAoaGRjLCAmcmVjdCwgQkRSX1NVTktFTk9VVEVSLCBCRl9SRUNUIHwgQkZfQURKVVNUKTsKICAgIH0KICAgIGVsc2UgaWYgKEhBU19CSUdGUkFNRSggZHdTdHlsZSwgZHdFeFN0eWxlKSkgewogICAgICAgIERyYXdFZGdlIChoZGMsICZyZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCB8IEJGX0FESlVTVCk7CiAgICB9CgogICAgTkNfRHJhd0ZyYW1lOTUoaGRjLCAmcmVjdCwgYWN0aXZlLCBkd1N0eWxlLCBkd0V4U3R5bGUgKTsKCiAgICBpZiAoKGR3U3R5bGUgJiBXU19DQVBUSU9OKSA9PSBXU19DQVBUSU9OKQogICAgewogICAgICAgIFJFQ1QgIHIgPSByZWN0OwogICAgICAgIGlmIChkd0V4U3R5bGUgJiBXU19FWF9UT09MV0lORE9XKSB7CiAgICAgICAgICAgIHIuYm90dG9tID0gcmVjdC50b3AgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU01DQVBUSU9OKTsKICAgICAgICAgICAgcmVjdC50b3AgKz0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNNQ0FQVElPTik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByLmJvdHRvbSA9IHJlY3QudG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pOwogICAgICAgICAgICByZWN0LnRvcCArPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZQ0FQVElPTik7CiAgICAgICAgfQogICAgICAgIGlmKCAhY2xpcCB8fCBJbnRlcnNlY3RSZWN0KCAmcmZ1enosICZyLCAmcmVjdENsaXAgKSApCiAgICAgICAgICAgIE5DX0RyYXdDYXB0aW9uOTUgKGhkYywgJnIsIGh3bmQsIGR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RXhTdHlsZSwgYWN0aXZlKTsKICAgIH0KCiAgICBpZiAoaGFzX21lbnUpCiAgICB7CglSRUNUIHIgPSByZWN0OwoJci5ib3R0b20gPSByZWN0LnRvcCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lNRU5VKTsKCglUUkFDRSgiQ2FsbGluZyBEcmF3TWVudUJhciB3aXRoIHJlY3QgKCVkLCAlZCktKCVkLCAlZClcbiIsCiAgICAgICAgICAgICAgci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20pOwoKCXJlY3QudG9wICs9IE1FTlVfRHJhd01lbnVCYXIoIGhkYywgJnIsIGh3bmQsIHN1cHByZXNzX21lbnVwYWludCApICsgMTsKICAgIH0KCiAgICBUUkFDRSgiQWZ0ZXIgTWVudUJhciwgcmVjdCBpcyAoJWQsICVkKS0oJWQsICVkKS5cbiIsCiAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSApOwoKICAgIGlmIChkd0V4U3R5bGUgJiBXU19FWF9DTElFTlRFREdFKQoJRHJhd0VkZ2UgKGhkYywgJnJlY3QsIEVER0VfU1VOS0VOLCBCRl9SRUNUIHwgQkZfQURKVVNUKTsKCiAgICAvKiBEcmF3IHRoZSBzY3JvbGwtYmFycyAqLwoKICAgIGlmIChkd1N0eWxlICYgV1NfVlNDUk9MTCkKICAgICAgICBTQ1JPTExfRHJhd1Njcm9sbEJhciggaHduZCwgaGRjLCBTQl9WRVJULCBUUlVFLCBUUlVFICk7CiAgICBpZiAoZHdTdHlsZSAmIFdTX0hTQ1JPTEwpCiAgICAgICAgU0NST0xMX0RyYXdTY3JvbGxCYXIoIGh3bmQsIGhkYywgU0JfSE9SWiwgVFJVRSwgVFJVRSApOwoKICAgIC8qIERyYXcgdGhlICJzaXplLWJveCIgKi8KICAgIGlmICgoZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpICYmIChkd1N0eWxlICYgV1NfSFNDUk9MTCkpCiAgICB7CiAgICAgICAgUkVDVCByID0gcmVjdDsKICAgICAgICByLmxlZnQgPSByLnJpZ2h0IC0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpICsgMTsKICAgICAgICByLnRvcCAgPSByLmJvdHRvbSAtIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lIU0NST0xMKSArIDE7CiAgICAgICAgRmlsbFJlY3QoIGhkYywgJnIsICBHZXRTeXNDb2xvckJydXNoKENPTE9SX1NDUk9MTEJBUikgKTsKICAgIH0KCiAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5DX0hhbmRsZU5DUGFpbnQKICoKICogSGFuZGxlIGEgV01fTkNQQUlOVCBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAqLwpMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQgaHduZCAsIEhSR04gY2xpcCkKewogICAgRFdPUkQgZHdTdHlsZSA9IEdldFdpbmRvd0xvbmdXKCBod25kLCBHV0xfU1RZTEUgKTsKCiAgICBpZiggZHdTdHlsZSAmIFdTX1ZJU0lCTEUgKQogICAgewoJaWYoIGR3U3R5bGUgJiBXU19NSU5JTUlaRSApCgkgICAgV0lOUE9TX1JlZHJhd0ljb25UaXRsZSggaHduZCApOwoJZWxzZSBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKCSAgICBOQ19Eb05DUGFpbnQoIGh3bmQsIGNsaXAsIEZBTFNFICk7CgllbHNlCgkgICAgTkNfRG9OQ1BhaW50OTUoIGh3bmQsIGNsaXAsIEZBTFNFICk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfSGFuZGxlTkNBY3RpdmF0ZQogKgogKiBIYW5kbGUgYSBXTV9OQ0FDVElWQVRFIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICovCkxPTkcgTkNfSGFuZGxlTkNBY3RpdmF0ZSggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtICkKewogICAgV05EKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwoKICAgIC8qIExvdHVzIE5vdGVzIGRyYXdzIG1lbnUgZGVzY3JpcHRpb25zIGluIHRoZSBjYXB0aW9uIG9mIGl0cyBtYWluCiAgICAgKiB3aW5kb3cuIFdoZW4gaXQgd2FudHMgdG8gcmVzdG9yZSBvcmlnaW5hbCAic3lzdGVtIiB2aWV3LCBpdCBqdXN0CiAgICAgKiBzZW5kcyBXTV9OQ0FDVElWQVRFIG1lc3NhZ2UgdG8gaXRzZWxmLiBBbnkgb3B0aW1pemF0aW9ucyBoZXJlIGluCiAgICAgKiBhdHRlbXB0IHRvIG1pbmltaXplIHJlZHJhd2luZ3MgbGVhZCB0byBhIG5vdCByZXN0b3JlZCBjYXB0aW9uLgogICAgICovCiAgICBpZiAod25kUHRyKQogICAgewoJaWYgKHdQYXJhbSkgd25kUHRyLT5mbGFncyB8PSBXSU5fTkNBQ1RJVkFURUQ7CgllbHNlIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9OQ0FDVElWQVRFRDsKICAgICAgICBXSU5fUmVsZWFzZVduZFB0cih3bmRQdHIpOwoKCWlmIChJc0ljb25pYyhod25kKSkgV0lOUE9TX1JlZHJhd0ljb25UaXRsZSggaHduZCApOwoJZWxzZSBpZiAoVFdFQUtfV2luZUxvb2sgPT0gV0lOMzFfTE9PSykKCSAgICBOQ19Eb05DUGFpbnQoIGh3bmQsIChIUkdOKTEsIEZBTFNFICk7CgllbHNlCgkgICAgTkNfRG9OQ1BhaW50OTUoIGh3bmQsIChIUkdOKTEsIEZBTFNFICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfSGFuZGxlU2V0Q3Vyc29yCiAqCiAqIEhhbmRsZSBhIFdNX1NFVENVUlNPUiBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAqLwpMT05HIE5DX0hhbmRsZVNldEN1cnNvciggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKewogICAgaHduZCA9IFdJTl9HZXRGdWxsSGFuZGxlKCAoSFdORCl3UGFyYW0gKTsKCiAgICBzd2l0Y2goTE9XT1JEKGxQYXJhbSkpCiAgICB7CiAgICBjYXNlIEhURVJST1I6Cgl7CgkgICAgV09SRCBtc2cgPSBISVdPUkQoIGxQYXJhbSApOwoJICAgIGlmICgobXNnID09IFdNX0xCVVRUT05ET1dOKSB8fCAobXNnID09IFdNX01CVVRUT05ET1dOKSB8fAoJCShtc2cgPT0gV01fUkJVVFRPTkRPV04pKQoJCU1lc3NhZ2VCZWVwKDApOwoJfQoJYnJlYWs7CgogICAgY2FzZSBIVENMSUVOVDoKCXsKCSAgICBIQ1VSU09SIGhDdXJzb3IgPSAoSENVUlNPUilHZXRDbGFzc0xvbmdBKGh3bmQsIEdDTF9IQ1VSU09SKTsKCSAgICBpZihoQ3Vyc29yKSB7CgkJU2V0Q3Vyc29yKGhDdXJzb3IpOwoJCXJldHVybiBUUlVFOwoJICAgIH0KICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoJfQoKICAgIGNhc2UgSFRMRUZUOgogICAgY2FzZSBIVFJJR0hUOgoJcmV0dXJuIChMT05HKVNldEN1cnNvciggTG9hZEN1cnNvckEoIDAsIElEQ19TSVpFV0VBICkgKTsKCiAgICBjYXNlIEhUVE9QOgogICAgY2FzZSBIVEJPVFRPTToKCXJldHVybiAoTE9ORylTZXRDdXJzb3IoIExvYWRDdXJzb3JBKCAwLCBJRENfU0laRU5TQSApICk7CgogICAgY2FzZSBIVFRPUExFRlQ6CiAgICBjYXNlIEhUQk9UVE9NUklHSFQ6CglyZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yQSggMCwgSURDX1NJWkVOV1NFQSApICk7CgogICAgY2FzZSBIVFRPUFJJR0hUOgogICAgY2FzZSBIVEJPVFRPTUxFRlQ6CglyZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yQSggMCwgSURDX1NJWkVORVNXQSApICk7CiAgICB9CgogICAgLyogRGVmYXVsdCBjdXJzb3I6IGFycm93ICovCiAgICByZXR1cm4gKExPTkcpU2V0Q3Vyc29yKCBMb2FkQ3Vyc29yQSggMCwgSURDX0FSUk9XQSApICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfR2V0U3lzUG9wdXBQb3MKICovCnZvaWQgTkNfR2V0U3lzUG9wdXBQb3MoIEhXTkQgaHduZCwgUkVDVCogcmVjdCApCnsKICAgIGlmIChJc0ljb25pYyhod25kKSkgR2V0V2luZG93UmVjdCggaHduZCwgcmVjdCApOwogICAgZWxzZQogICAgewogICAgICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICAgICBpZiAoIXduZFB0cikgcmV0dXJuOwoKICAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCByZWN0ICk7CiAgICAgICAgT2Zmc2V0UmVjdCggcmVjdCwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQsIHduZFB0ci0+cmVjdFdpbmRvdy50b3ApOwogICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4oIEdldFBhcmVudChod25kKSwgKFBPSU5UICopcmVjdCApOwogICAgICAgIGlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKSB7CiAgICAgICAgICAgIHJlY3QtPnJpZ2h0ID0gcmVjdC0+bGVmdCArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1hTSVpFKTsKICAgICAgICAgICAgcmVjdC0+Ym90dG9tID0gcmVjdC0+dG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNJWkUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVjdC0+cmlnaHQgPSByZWN0LT5sZWZ0ICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pIC0gMTsKICAgICAgICAgICAgcmVjdC0+Ym90dG9tID0gcmVjdC0+dG9wICsgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUNBUFRJT04pIC0gMTsKICAgICAgICB9CiAgICAgICAgV0lOX1JlbGVhc2VXbmRQdHIoIHduZFB0ciApOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5DX1RyYWNrTWluTWF4Qm94OTUKICoKICogVHJhY2sgYSBtb3VzZSBidXR0b24gcHJlc3Mgb24gdGhlIG1pbmltaXplIG9yIG1heGltaXplIGJveC4KICoKICogVGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW4gMy4xIGFuZCA5NSBpcyB0aGUgZGlzYWJsZWQgYnV0dG9uIHN0YXRlLgogKiBJbiB3aW45NSB0aGUgc3lzdGVtIGJ1dHRvbiBjYW4gYmUgZGlzYWJsZWQsIHNvIGl0IGNhbiBpZ25vcmUgdGhlIG1vdXNlCiAqIGV2ZW50LgogKgogKi8Kc3RhdGljIHZvaWQgTkNfVHJhY2tNaW5NYXhCb3g5NSggSFdORCBod25kLCBXT1JEIHdQYXJhbSApCnsKICAgIE1TRyBtc2c7CiAgICBIREMgaGRjID0gR2V0V2luZG93REMoIGh3bmQgKTsKICAgIEJPT0wgcHJlc3NlZCA9IFRSVUU7CiAgICBVSU5UIHN0YXRlOwogICAgRFdPUkQgd25kU3R5bGUgPSBHZXRXaW5kb3dMb25nQSggaHduZCwgR1dMX1NUWUxFKTsKICAgIEhNRU5VIGhTeXNNZW51ID0gR2V0U3lzdGVtTWVudShod25kLCBGQUxTRSk7CgogICAgdm9pZCAgKCpwYWludEJ1dHRvbikoSFdORCwgSERDMTYsIEJPT0wsIEJPT0wpOwoKICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCiAgICB7CgkvKiBJZiB0aGUgc3R5bGUgaXMgbm90IHByZXNlbnQsIGRvIG5vdGhpbmcgKi8KCWlmICghKHduZFN0eWxlICYgV1NfTUlOSU1JWkVCT1gpKQoJICAgIHJldHVybjsKCgkvKiBDaGVjayBpZiB0aGUgc3lzbWVudSBpdGVtIGZvciBtaW5pbWl6ZSBpcyB0aGVyZSAgKi8KCXN0YXRlID0gR2V0TWVudVN0YXRlKGhTeXNNZW51LCBTQ19NSU5JTUlaRSwgTUZfQllDT01NQU5EKTsKCglwYWludEJ1dHRvbiA9ICZOQ19EcmF3TWluQnV0dG9uOTU7CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBJZiB0aGUgc3R5bGUgaXMgbm90IHByZXNlbnQsIGRvIG5vdGhpbmcgKi8KCWlmICghKHduZFN0eWxlICYgV1NfTUFYSU1JWkVCT1gpKQoJICAgIHJldHVybjsKCgkvKiBDaGVjayBpZiB0aGUgc3lzbWVudSBpdGVtIGZvciBtYXhpbWl6ZSBpcyB0aGVyZSAgKi8KCXN0YXRlID0gR2V0TWVudVN0YXRlKGhTeXNNZW51LCBTQ19NQVhJTUlaRSwgTUZfQllDT01NQU5EKTsKCglwYWludEJ1dHRvbiA9ICZOQ19EcmF3TWF4QnV0dG9uOTU7CiAgICB9CgogICAgU2V0Q2FwdHVyZSggaHduZCApOwoKICAgICgqcGFpbnRCdXR0b24pKCBod25kLCBoZGMsIFRSVUUsIEZBTFNFKTsKCiAgICB3aGlsZSgxKQogICAgewoJQk9PTCBvbGRzdGF0ZSA9IHByZXNzZWQ7CgogICAgICAgIGlmICghR2V0TWVzc2FnZVcoICZtc2csIDAsIFdNX01PVVNFRklSU1QsIFdNX01PVVNFTEFTVCApKSBicmVhazsKICAgICAgICBpZiAoQ2FsbE1zZ0ZpbHRlclcoICZtc2csIE1TR0ZfTUFYICkpIGNvbnRpbnVlOwoKCWlmKG1zZy5tZXNzYWdlID09IFdNX0xCVVRUT05VUCkKCSAgICBicmVhazsKCglpZihtc2cubWVzc2FnZSAhPSBXTV9NT1VTRU1PVkUpCgkgICAgY29udGludWU7CgoJcHJlc3NlZCA9IChOQ19IYW5kbGVOQ0hpdFRlc3QoIGh3bmQsIG1zZy5wdCApID09IHdQYXJhbSk7CglpZiAocHJlc3NlZCAhPSBvbGRzdGF0ZSkKCSAgICgqcGFpbnRCdXR0b24pKCBod25kLCBoZGMsIHByZXNzZWQsIEZBTFNFKTsKICAgIH0KCiAgICBpZihwcmVzc2VkKQoJKCpwYWludEJ1dHRvbikoaHduZCwgaGRjLCBGQUxTRSwgRkFMU0UpOwoKICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwoKICAgIC8qIElmIHRoZSBpdGVtIG1pbmltaXplIG9yIG1heGltaXplIG9mIHRoZSBzeXNtZW51IGFyZSBub3QgdGhlcmUgKi8KICAgIC8qIG9yIGlmIHRoZSBzdHlsZSBpcyBub3QgcHJlc2VudCwgZG8gbm90aGluZyAqLwogICAgaWYgKCghcHJlc3NlZCkgfHwgKHN0YXRlID09IDB4RkZGRkZGRkYpKQoJcmV0dXJuOwoKICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCiAgICAgICAgU2VuZE1lc3NhZ2VBKCBod25kLCBXTV9TWVNDT01NQU5ELCBTQ19NSU5JTUlaRSwgTUFLRUxPTkcobXNnLnB0LngsbXNnLnB0LnkpICk7CiAgICBlbHNlCiAgICAgICAgU2VuZE1lc3NhZ2VBKCBod25kLCBXTV9TWVNDT01NQU5ELAogICAgICAgICAgICAgICAgICAgICAgSXNab29tZWQoaHduZCkgPyBTQ19SRVNUT1JFOlNDX01BWElNSVpFLCBNQUtFTE9ORyhtc2cucHQueCxtc2cucHQueSkgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOQ19UcmFja01pbk1heEJveAogKgogKiBUcmFjayBhIG1vdXNlIGJ1dHRvbiBwcmVzcyBvbiB0aGUgbWluaW1pemUgb3IgbWF4aW1pemUgYm94LgogKi8Kc3RhdGljIHZvaWQgTkNfVHJhY2tNaW5NYXhCb3goIEhXTkQgaHduZCwgV09SRCB3UGFyYW0gKQp7CiAgICBNU0cgbXNnOwogICAgSERDIGhkYyA9IEdldFdpbmRvd0RDKCBod25kICk7CiAgICBCT09MIHByZXNzZWQgPSBUUlVFOwogICAgdm9pZCAgKCpwYWludEJ1dHRvbikoSFdORCwgSERDMTYsIEJPT0wpOwoKICAgIFNldENhcHR1cmUoIGh3bmQgKTsKCiAgICBpZiAod1BhcmFtID09IEhUTUlOQlVUVE9OKQoJcGFpbnRCdXR0b24gPSAmTkNfRHJhd01pbkJ1dHRvbjsKICAgIGVsc2UKCXBhaW50QnV0dG9uID0gJk5DX0RyYXdNYXhCdXR0b247CgogICAgKCpwYWludEJ1dHRvbikoIGh3bmQsIGhkYywgVFJVRSk7CgogICAgd2hpbGUoMSkKICAgIHsKCUJPT0wgb2xkc3RhdGUgPSBwcmVzc2VkOwoKICAgICAgICBpZiAoIUdldE1lc3NhZ2VXKCAmbXNnLCAwLCBXTV9NT1VTRUZJUlNULCBXTV9NT1VTRUxBU1QgKSkgYnJlYWs7CiAgICAgICAgaWYgKENhbGxNc2dGaWx0ZXJXKCAmbXNnLCBNU0dGX01BWCApKSBjb250aW51ZTsKCglpZihtc2cubWVzc2FnZSA9PSBXTV9MQlVUVE9OVVApCgkgICAgYnJlYWs7CgoJaWYobXNnLm1lc3NhZ2UgIT0gV01fTU9VU0VNT1ZFKQoJICAgIGNvbnRpbnVlOwoKCXByZXNzZWQgPSAoTkNfSGFuZGxlTkNIaXRUZXN0KCBod25kLCBtc2cucHQgKSA9PSB3UGFyYW0pOwoJaWYgKHByZXNzZWQgIT0gb2xkc3RhdGUpCgkgICAoKnBhaW50QnV0dG9uKSggaHduZCwgaGRjLCBwcmVzc2VkKTsKICAgIH0KCiAgICBpZihwcmVzc2VkKQoJKCpwYWludEJ1dHRvbikoIGh3bmQsIGhkYywgRkFMU0UpOwoKICAgIFJlbGVhc2VDYXB0dXJlKCk7CiAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwoKICAgIGlmICghcHJlc3NlZCkgcmV0dXJuOwoKICAgIGlmICh3UGFyYW0gPT0gSFRNSU5CVVRUT04pCiAgICAgICAgU2VuZE1lc3NhZ2VBKCBod25kLCBXTV9TWVNDT01NQU5ELCBTQ19NSU5JTUlaRSwgTUFLRUxPTkcobXNnLnB0LngsbXNnLnB0LnkpICk7CiAgICBlbHNlCiAgICAgICAgU2VuZE1lc3NhZ2VBKCBod25kLCBXTV9TWVNDT01NQU5ELAogICAgICAgICAgICAgICAgICAgICAgSXNab29tZWQoaHduZCkgPyBTQ19SRVNUT1JFOlNDX01BWElNSVpFLCBNQUtFTE9ORyhtc2cucHQueCxtc2cucHQueSkgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOQ19UcmFja0Nsb3NlQnV0dG9uOTUKICoKICogVHJhY2sgYSBtb3VzZSBidXR0b24gcHJlc3Mgb24gdGhlIFdpbjk1IGNsb3NlIGJ1dHRvbi4KICovCnN0YXRpYyB2b2lkCk5DX1RyYWNrQ2xvc2VCdXR0b245NSAoSFdORCBod25kLCBXT1JEIHdQYXJhbSkKewogICAgTVNHIG1zZzsKICAgIEhEQyBoZGM7CiAgICBCT09MIHByZXNzZWQgPSBUUlVFOwogICAgSE1FTlUgaFN5c01lbnUgPSBHZXRTeXN0ZW1NZW51KGh3bmQsIEZBTFNFKTsKICAgIFVJTlQgc3RhdGU7CgogICAgaWYoaFN5c01lbnUgPT0gMCkKCXJldHVybjsKCiAgICBzdGF0ZSA9IEdldE1lbnVTdGF0ZShoU3lzTWVudSwgU0NfQ0xPU0UsIE1GX0JZQ09NTUFORCk7CgogICAgLyogSWYgdGhlIGl0ZW0gY2xvc2Ugb2YgdGhlIHN5c21lbnUgaXMgZGlzYWJsZWQgb3Igbm90IHRoZXJlIGRvIG5vdGhpbmcgKi8KICAgIGlmKChzdGF0ZSAmIE1GX0RJU0FCTEVEKSB8fCAoc3RhdGUgJiBNRl9HUkFZRUQpIHx8IChzdGF0ZSA9PSAweEZGRkZGRkZGKSkKCXJldHVybjsKCiAgICBoZGMgPSBHZXRXaW5kb3dEQyggaHduZCApOwoKICAgIFNldENhcHR1cmUoIGh3bmQgKTsKCiAgICBOQ19EcmF3Q2xvc2VCdXR0b245NSAoaHduZCwgaGRjLCBUUlVFLCBGQUxTRSk7CgogICAgd2hpbGUoMSkKICAgIHsKCUJPT0wgb2xkc3RhdGUgPSBwcmVzc2VkOwoKICAgICAgICBpZiAoIUdldE1lc3NhZ2VXKCAmbXNnLCAwLCBXTV9NT1VTRUZJUlNULCBXTV9NT1VTRUxBU1QgKSkgYnJlYWs7CiAgICAgICAgaWYgKENhbGxNc2dGaWx0ZXJXKCAmbXNnLCBNU0dGX01BWCApKSBjb250aW51ZTsKCglpZihtc2cubWVzc2FnZSA9PSBXTV9MQlVUVE9OVVApCgkgICAgYnJlYWs7CgoJaWYobXNnLm1lc3NhZ2UgIT0gV01fTU9VU0VNT1ZFKQoJICAgIGNvbnRpbnVlOwoKCXByZXNzZWQgPSAoTkNfSGFuZGxlTkNIaXRUZXN0KCBod25kLCBtc2cucHQgKSA9PSB3UGFyYW0pOwoJaWYgKHByZXNzZWQgIT0gb2xkc3RhdGUpCgkgICBOQ19EcmF3Q2xvc2VCdXR0b245NSAoaHduZCwgaGRjLCBwcmVzc2VkLCBGQUxTRSk7CiAgICB9CgogICAgaWYocHJlc3NlZCkKCU5DX0RyYXdDbG9zZUJ1dHRvbjk1IChod25kLCBoZGMsIEZBTFNFLCBGQUxTRSk7CgogICAgUmVsZWFzZUNhcHR1cmUoKTsKICAgIFJlbGVhc2VEQyggaHduZCwgaGRjICk7CiAgICBpZiAoIXByZXNzZWQpIHJldHVybjsKCiAgICBTZW5kTWVzc2FnZUEoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX0NMT1NFLCBNQUtFTE9ORyhtc2cucHQueCxtc2cucHQueSkgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfVHJhY2tTY3JvbGxCYXIKICoKICogVHJhY2sgYSBtb3VzZSBidXR0b24gcHJlc3Mgb24gdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgc2Nyb2xsLWJhci4KICovCnN0YXRpYyB2b2lkIE5DX1RyYWNrU2Nyb2xsQmFyKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIFBPSU5UIHB0ICkKewogICAgSU5UIHNjcm9sbGJhcjsKCiAgICBpZiAoKHdQYXJhbSAmIDB4ZmZmMCkgPT0gU0NfSFNDUk9MTCkKICAgIHsKICAgICAgICBpZiAoKHdQYXJhbSAmIDB4MGYpICE9IEhUSFNDUk9MTCkgcmV0dXJuOwoJc2Nyb2xsYmFyID0gU0JfSE9SWjsKICAgIH0KICAgIGVsc2UgIC8qIFNDX1ZTQ1JPTEwgKi8KICAgIHsKICAgICAgICBpZiAoKHdQYXJhbSAmIDB4MGYpICE9IEhUVlNDUk9MTCkgcmV0dXJuOwoJc2Nyb2xsYmFyID0gU0JfVkVSVDsKICAgIH0KICAgIFNDUk9MTF9UcmFja1Njcm9sbEJhciggaHduZCwgc2Nyb2xsYmFyLCBwdCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duCiAqCiAqIEhhbmRsZSBhIFdNX05DTEJVVFRPTkRPV04gbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogKi8KTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25Eb3duKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQp7CiAgICBMT05HIHN0eWxlID0gR2V0V2luZG93TG9uZ0EoIGh3bmQsIEdXTF9TVFlMRSApOwoKICAgIHN3aXRjaCh3UGFyYW0pICAvKiBIaXQgdGVzdCAqLwogICAgewogICAgY2FzZSBIVENBUFRJT046CiAgICAgICAgewogICAgICAgICAgICBIV05EIHRvcCA9IEdldEFuY2VzdG9yKCBod25kLCBHQV9ST09UICk7CgogICAgICAgICAgICBpZiAoRk9DVVNfTW91c2VBY3RpdmF0ZSggdG9wICkgfHwgKEdldEFjdGl2ZVdpbmRvdygpID09IHRvcCkpCiAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVkUgKyBIVENBUFRJT04sIGxQYXJhbSApOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgY2FzZSBIVFNZU01FTlU6CgkgaWYoIHN0eWxlICYgV1NfU1lTTUVOVSApCgkgewoJICAgICBpZiggIShzdHlsZSAmIFdTX01JTklNSVpFKSApCgkgICAgIHsKCQlIREMgaERDID0gR2V0V2luZG93REMoaHduZCk7CgkJaWYgKFRXRUFLX1dpbmVMb29rID09IFdJTjMxX0xPT0spCgkJICAgIE5DX0RyYXdTeXNCdXR0b24oIGh3bmQsIGhEQywgVFJVRSApOwoJCWVsc2UKCQkgICAgTkNfRHJhd1N5c0J1dHRvbjk1KCBod25kLCBoREMsIFRSVUUgKTsKCQlSZWxlYXNlREMoIGh3bmQsIGhEQyApOwoJICAgICB9CgkgICAgIFNlbmRNZXNzYWdlVyggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfTU9VU0VNRU5VICsgSFRTWVNNRU5VLCBsUGFyYW0gKTsKCSB9CgkgYnJlYWs7CgogICAgY2FzZSBIVE1FTlU6CglTZW5kTWVzc2FnZVcoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX01PVVNFTUVOVSwgbFBhcmFtICk7CglicmVhazsKCiAgICBjYXNlIEhUSFNDUk9MTDoKCVNlbmRNZXNzYWdlVyggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfSFNDUk9MTCArIEhUSFNDUk9MTCwgbFBhcmFtICk7CglicmVhazsKCiAgICBjYXNlIEhUVlNDUk9MTDoKCVNlbmRNZXNzYWdlVyggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfVlNDUk9MTCArIEhUVlNDUk9MTCwgbFBhcmFtICk7CglicmVhazsKCiAgICBjYXNlIEhUTUlOQlVUVE9OOgogICAgY2FzZSBIVE1BWEJVVFRPTjoKCWlmIChUV0VBS19XaW5lTG9vayA9PSBXSU4zMV9MT09LKQoJICAgIE5DX1RyYWNrTWluTWF4Qm94KCBod25kLCB3UGFyYW0gKTsKCWVsc2UKCSAgICBOQ19UcmFja01pbk1heEJveDk1KCBod25kLCB3UGFyYW0gKTsKCWJyZWFrOwoKICAgIGNhc2UgSFRDTE9TRToKCWlmIChUV0VBS19XaW5lTG9vayA+PSBXSU45NV9MT09LKQoJICAgIE5DX1RyYWNrQ2xvc2VCdXR0b245NSAoaHduZCwgd1BhcmFtKTsKCWJyZWFrOwoKICAgIGNhc2UgSFRMRUZUOgogICAgY2FzZSBIVFJJR0hUOgogICAgY2FzZSBIVFRPUDoKICAgIGNhc2UgSFRUT1BMRUZUOgogICAgY2FzZSBIVFRPUFJJR0hUOgogICAgY2FzZSBIVEJPVFRPTToKICAgIGNhc2UgSFRCT1RUT01MRUZUOgogICAgY2FzZSBIVEJPVFRPTVJJR0hUOgoJLyogbWFrZSBzdXJlIGhpdHRlc3QgZml0cyBpbnRvIDB4ZiBhbmQgZG9lc24ndCBvdmVybGFwIHdpdGggSFRTWVNNRU5VICovCglTZW5kTWVzc2FnZVcoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX1NJWkUgKyB3UGFyYW0gLSAyLCBsUGFyYW0pOwoJYnJlYWs7CgogICAgY2FzZSBIVEJPUkRFUjoKCWJyZWFrOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5DX0hhbmRsZU5DTEJ1dHRvbkRibENsawogKgogKiBIYW5kbGUgYSBXTV9OQ0xCVVRUT05EQkxDTEsgbWVzc2FnZS4gQ2FsbGVkIGZyb20gRGVmV2luZG93UHJvYygpLgogKi8KTE9ORyBOQ19IYW5kbGVOQ0xCdXR0b25EYmxDbGsoIEhXTkQgaHduZCwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCnsKICAgIC8qCiAgICAgKiBpZiB0aGlzIGlzIGFuIGljb24sIHNlbmQgYSByZXN0b3JlIHNpbmNlIHdlIGFyZSBoYW5kbGluZwogICAgICogYSBkb3VibGUgY2xpY2sKICAgICAqLwogICAgaWYgKElzSWNvbmljKGh3bmQpKQogICAgewogICAgICAgIFNlbmRNZXNzYWdlVyggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfUkVTVE9SRSwgbFBhcmFtICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgc3dpdGNoKHdQYXJhbSkgIC8qIEhpdCB0ZXN0ICovCiAgICB7CiAgICBjYXNlIEhUQ0FQVElPTjoKICAgICAgICAvKiBzdG9wIHByb2Nlc3NpbmcgaWYgV1NfTUFYSU1JWkVCT1ggaXMgbWlzc2luZyAqLwogICAgICAgIGlmIChHZXRXaW5kb3dMb25nQSggaHduZCwgR1dMX1NUWUxFICkgJiBXU19NQVhJTUlaRUJPWCkKICAgICAgICAgICAgU2VuZE1lc3NhZ2VXKCBod25kLCBXTV9TWVNDT01NQU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgIElzWm9vbWVkKGh3bmQpID8gU0NfUkVTVE9SRSA6IFNDX01BWElNSVpFLCBsUGFyYW0gKTsKCWJyZWFrOwoKICAgIGNhc2UgSFRTWVNNRU5VOgogICAgICAgIGlmICghKEdldENsYXNzTG9uZ1coaHduZCwgR0NMX1NUWUxFKSAmIENTX05PQ0xPU0UpKQogICAgICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX0NMT1NFLCBsUGFyYW0gKTsKCWJyZWFrOwoKICAgIGNhc2UgSFRIU0NST0xMOgogICAgICAgIFNlbmRNZXNzYWdlVyggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfSFNDUk9MTCArIEhUSFNDUk9MTCwgbFBhcmFtICk7CglicmVhazsKCiAgICBjYXNlIEhUVlNDUk9MTDoKICAgICAgICBTZW5kTWVzc2FnZVcoIGh3bmQsIFdNX1NZU0NPTU1BTkQsIFNDX1ZTQ1JPTEwgKyBIVFZTQ1JPTEwsIGxQYXJhbSApOwoJYnJlYWs7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTkNfSGFuZGxlU3lzQ29tbWFuZAogKgogKiBIYW5kbGUgYSBXTV9TWVNDT01NQU5EIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KICovCkxPTkcgTkNfSGFuZGxlU3lzQ29tbWFuZCggSFdORCBod25kLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKewogICAgVFJBQ0UoIkhhbmRsaW5nIFdNX1NZU0NPTU1BTkQgJXggJWx4XG4iLCB3UGFyYW0sIGxQYXJhbSApOwoKICAgIHN3aXRjaCAod1BhcmFtICYgMHhmZmYwKQogICAgewogICAgY2FzZSBTQ19TSVpFOgogICAgY2FzZSBTQ19NT1ZFOgogICAgICAgIGlmIChVU0VSX0RyaXZlci5wU3lzQ29tbWFuZFNpemVNb3ZlKQogICAgICAgICAgICBVU0VSX0RyaXZlci5wU3lzQ29tbWFuZFNpemVNb3ZlKCBod25kLCB3UGFyYW0gKTsKCWJyZWFrOwoKICAgIGNhc2UgU0NfTUlOSU1JWkU6CiAgICAgICAgaWYgKGh3bmQgPT0gR2V0Rm9yZWdyb3VuZFdpbmRvdygpKQogICAgICAgICAgICBTaG93T3duZWRQb3B1cHMoaHduZCxGQUxTRSk7CglTaG93V2luZG93KCBod25kLCBTV19NSU5JTUlaRSApOwoJYnJlYWs7CgogICAgY2FzZSBTQ19NQVhJTUlaRToKICAgICAgICBpZiAoSXNJY29uaWMoaHduZCkgJiYgaHduZCA9PSBHZXRGb3JlZ3JvdW5kV2luZG93KCkpCiAgICAgICAgICAgIFNob3dPd25lZFBvcHVwcyhod25kLFRSVUUpOwoJU2hvd1dpbmRvdyggaHduZCwgU1dfTUFYSU1JWkUgKTsKCWJyZWFrOwoKICAgIGNhc2UgU0NfUkVTVE9SRToKICAgICAgICBpZiAoSXNJY29uaWMoaHduZCkgJiYgaHduZCA9PSBHZXRGb3JlZ3JvdW5kV2luZG93KCkpCiAgICAgICAgICAgIFNob3dPd25lZFBvcHVwcyhod25kLFRSVUUpOwoJU2hvd1dpbmRvdyggaHduZCwgU1dfUkVTVE9SRSApOwoJYnJlYWs7CgogICAgY2FzZSBTQ19DTE9TRToKCXJldHVybiBTZW5kTWVzc2FnZUEoIGh3bmQsIFdNX0NMT1NFLCAwLCAwICk7CgogICAgY2FzZSBTQ19WU0NST0xMOgogICAgY2FzZSBTQ19IU0NST0xMOgogICAgICAgIHsKICAgICAgICAgICAgUE9JTlQgcHQ7CiAgICAgICAgICAgIHB0LnggPSBTTE9XT1JEKGxQYXJhbSk7CiAgICAgICAgICAgIHB0LnkgPSBTSElXT1JEKGxQYXJhbSk7CiAgICAgICAgICAgIE5DX1RyYWNrU2Nyb2xsQmFyKCBod25kLCB3UGFyYW0sIHB0ICk7CiAgICAgICAgfQoJYnJlYWs7CgogICAgY2FzZSBTQ19NT1VTRU1FTlU6CiAgICAgICAgewogICAgICAgICAgICBQT0lOVCBwdDsKICAgICAgICAgICAgcHQueCA9IFNMT1dPUkQobFBhcmFtKTsKICAgICAgICAgICAgcHQueSA9IFNISVdPUkQobFBhcmFtKTsKICAgICAgICAgICAgTUVOVV9UcmFja01vdXNlTWVudUJhciggaHduZCwgd1BhcmFtICYgMHgwMDBGLCBwdCApOwogICAgICAgIH0KCWJyZWFrOwoKICAgIGNhc2UgU0NfS0VZTUVOVToKICAgICAgICBNRU5VX1RyYWNrS2JkTWVudUJhciggaHduZCwgd1BhcmFtLCBMT1dPUkQobFBhcmFtKSApOwoJYnJlYWs7CgogICAgY2FzZSBTQ19UQVNLTElTVDoKCVdpbkV4ZWMoICJ0YXNrbWFuLmV4ZSIsIFNXX1NIT1dOT1JNQUwgKTsKCWJyZWFrOwoKICAgIGNhc2UgU0NfU0NSRUVOU0FWRToKCWlmICh3UGFyYW0gPT0gU0NfQUJPVVRXSU5FKQogICAgICAgIHsKICAgICAgICAgICAgSE1PRFVMRSBobW9kdWxlID0gTG9hZExpYnJhcnlBKCAic2hlbGwzMi5kbGwiICk7CiAgICAgICAgICAgIGlmIChobW9kdWxlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGQVJQUk9DIGFib3V0cHJvYyA9IEdldFByb2NBZGRyZXNzKCBobW9kdWxlLCAiU2hlbGxBYm91dEEiICk7CiAgICAgICAgICAgICAgICBpZiAoYWJvdXRwcm9jKSBhYm91dHByb2MoIGh3bmQsIFBBQ0tBR0VfTkFNRSwgUEFDS0FHRV9TVFJJTkcsIDAgKTsKICAgICAgICAgICAgICAgIEZyZWVMaWJyYXJ5KCBobW9kdWxlICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNlCgkgIGlmICh3UGFyYW0gPT0gU0NfUFVUTUFSSykKICAgICAgICAgICAgVFJBQ0VfKHNoZWxsKSgiTWFyayByZXF1ZXN0ZWQgYnkgdXNlclxuIik7CglicmVhazsKCiAgICBjYXNlIFNDX0hPVEtFWToKICAgIGNhc2UgU0NfQVJSQU5HRToKICAgIGNhc2UgU0NfTkVYVFdJTkRPVzoKICAgIGNhc2UgU0NfUFJFVldJTkRPVzoKIAlGSVhNRSgidW5pbXBsZW1lbnRlZCFcbiIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogIE5DX0RyYXdHcmF5QnV0dG9uCioKKiBTdHViIGZvciB0aGUgZ3JheWVkIGJ1dHRvbiBvZiB0aGUgY2FwdGlvbgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpCT09MIE5DX0RyYXdHcmF5QnV0dG9uKEhEQyBoZGMsIGludCB4LCBpbnQgeSkKewogICAgSEJJVE1BUCBoTWFza0JtcDsKICAgIEhEQyBoZGNNYXNrID0gQ3JlYXRlQ29tcGF0aWJsZURDICgwKTsKICAgIEhCUlVTSCBoT2xkQnJ1c2g7CgogICAgaE1hc2tCbXAgPSBDcmVhdGVCaXRtYXAgKDEyLCAxMCwgMSwgMSwgbHBHcmF5TWFzayk7CgogICAgaWYoaE1hc2tCbXAgPT0gMCkKCXJldHVybiBGQUxTRTsKCiAgICBTZWxlY3RPYmplY3QgKGhkY01hc2ssIGhNYXNrQm1wKTsKCiAgICAvKiBEcmF3IHRoZSBncmF5ZWQgYml0bWFwIHVzaW5nIHRoZSBtYXNrICovCiAgICBoT2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QgKGhkYywgUkdCKDEyOCwgMTI4LCAxMjgpKTsKICAgIEJpdEJsdCAoaGRjLCB4LCB5LCAxMiwgMTAsCgkgICAgaGRjTWFzaywgMCwgMCwgMHhCODA3NEEpOwoKICAgIC8qIENsZWFuIHVwICovCiAgICBTZWxlY3RPYmplY3QgKGhkYywgaE9sZEJydXNoKTsKICAgIERlbGV0ZU9iamVjdChoTWFza0JtcCk7CiAgICBEZWxldGVEQyAoaGRjTWFzayk7CgogICAgcmV0dXJuIFRSVUU7Cn0K